mdev-parser 0.1.1

Parse the Busybox mdev configuration file
Documentation
number = @{ ASCII_DIGIT+ }
majmin = ${ "@" ~ number ~ "," ~ number ~ (("-" ~ number) | !"-") }

regex = @{ (!WHITESPACE ~ !";" ~ ASCII)+ }

envvar = @{ (ASCII_ALPHA_UPPER ~ (ASCII_ALPHA_UPPER | "_")*) }

stop = { "-" }

env_match = ${ envvar ~ "=" ~ regex ~ ";" }

device_regex = ${ (("$" ~ envvar ~ "=") | !"$") ~ regex }

name = @{ ASCII_ALPHA+ }
usergroup = { name ~ ":" ~ name }

mode = { '0'..'7'{3} }

// TODO:  maybe find a better definition
path_char = _{ !"/" ~ !"\x00" ~ !WHITESPACE ~ ANY }
path = @{ "/"? ~ (path_char+ ~ "/")* ~ path_char+? }

move_to = ${ "=" ~ path }
symlink = ${ ">" ~ path }
prevent = { "!" }
on_creation = ${ move_to | symlink | prevent }

after = { "@" }
before = { "$" }
both = { "*" }
when = { after | before | both }

exec = ${ when ~ path }
arg = @{ (!WHITESPACE ~ !NEWLINE ~ ASCII)+ }
command = { exec ~ arg* }

// matcher is separated to apply the $ modifier
matcher = ${ stop? ~ env_match* ~ ((!"@" ~ device_regex) | majmin) }
rule = { matcher ~ usergroup ~ mode ~ on_creation? ~ command? }
comment = ${ "#" ~ ANY* ~ (NEWLINE | EOI) }
empty = { WHITESPACE* ~ (NEWLINE | EOI) }
line = { (comment | empty | (rule ~ (NEWLINE | EOI))) }

WHITESPACE = _{ " " | "\t" }