// A pest parser grammar for the pci.ids database.
file = _{ SOI ~ lines ~ &EOI }
lines = _{ (line)* }
line = _{
empty_line |
vendor |
class
}
empty_line = _{ NEWLINE }
// PCI id data lines
vendor = { vendor_line ~ device* }
vendor_line = _{ vendor_id ~ vendor_name ~ EOL }
vendor_id = @{ U16 }
vendor_name = @{ STRING_TO_EOL }
device = { device_line ~ subsystem* }
device_line = _{ "\t" ~ device_id ~ device_name ~ EOL }
device_id = @{ U16 }
device_name = @{ STRING_TO_EOL }
subsystem = { subsystem_line }
subsystem_line = _{ "\t\t" ~ subsystem_id ~ subsystem_name ~ EOL }
subsystem_id = { subvendor_id ~ subdevice_id }
subvendor_id = @{ U16 }
subdevice_id = @{ U16 }
subsystem_name = @{ STRING_TO_EOL }
// PCI class data lines
class = {class_line ~ subclass* }
class_line = _{ "C" ~ class_id ~ class_name ~ EOL }
class_id = @{ U8 }
class_name = @{ STRING_TO_EOL }
subclass = { subclass_line ~ prog_if* }
subclass_line = _{ "\t" ~ subclass_id ~ subclass_name ~ EOL }
subclass_id = @{ U8 }
subclass_name = @{ STRING_TO_EOL }
prog_if = { prog_if_line }
prog_if_line = _{ "\t\t" ~ prog_if_id ~ prog_if_name ~ EOL }
prog_if_id = @{ U8 }
prog_if_name = @{ STRING_TO_EOL }
// basic tokens
EOL = _{ (NEWLINE|&EOI) }
STRING_TO_EOL = @{(!EOL ~ ANY)* }
U16 = { HEX_DIGIT{4} }
U8 = { HEX_DIGIT{2} }
HEX_DIGIT = { ASCII_DIGIT | ('a'..'f') | ('A'..'F') }
WHITESPACE = _{ " " }
COMMENT = _{ "#" ~ (!"\n" ~ ANY)* ~ EOL }