| WHITESPACE = _{ " " | "\n" } |
| COMMENT = { block_comment | line_comment } |
| |
| block_comment = { "/*" ~ (!"*/" ~ ANY)* ~ "*/" } |
| line_comment = { "//" ~ (!"\n" ~ ANY)* } |
| |
| alpha = { 'a'..'z' | 'A'..'Z' } |
| digit = { '0'..'9' } |
| hexdigit = { digit | 'a'..'f' | 'A'..'F' } |
| alphanum = { alpha | digit | "_" } |
| |
| identifier = @{ alpha ~ alphanum* } |
| payload_identifier = @{ "_payload_" } |
| body_identifier = @{ "_body_" } |
| intvalue = @{ digit+ } |
| hexvalue = @{ ("0x"|"0X") ~ hexdigit+ } |
| integer = @{ hexvalue | intvalue } |
| string = @{ "\"" ~ (!"\"" ~ ANY)* ~ "\"" } |
| size_modifier = @{ |
| ("+"|"-"|"*"|"/") ~ (digit|"+"|"-"|"*"|"/")+ |
| } |
| |
| endianness_declaration = { "little_endian_packets" | "big_endian_packets" } |
| |
| enum_tag = { identifier ~ "=" ~ integer } |
| enum_tag_list = { enum_tag ~ ("," ~ enum_tag)* ~ ","? } |
| enum_declaration = { |
| "enum" ~ identifier ~ ":" ~ integer ~ "{" ~ |
| enum_tag_list ~ |
| "}" |
| } |
| |
| constraint = { identifier ~ "=" ~ (identifier|integer) } |
| constraint_list = { constraint ~ ("," ~ constraint)* } |
| |
| checksum_field = { "_checksum_start_" ~ "(" ~ identifier ~ ")" } |
| padding_field = { "_padding_" ~ "[" ~ integer ~ "]" } |
| size_field = { "_size_" ~ "(" ~ (identifier|payload_identifier|body_identifier) ~ ")" ~ ":" ~ integer } |
| count_field = { "_count_" ~ "(" ~ identifier ~ ")" ~ ":" ~ integer } |
| elementsize_field = { "_elementsize_" ~ "(" ~ identifier ~ ")" ~ ":" ~ integer } |
| body_field = @{ "_body_" } |
| payload_field = { "_payload_" ~ (":" ~ "[" ~ size_modifier ~ "]")? } |
| fixed_field = { "_fixed_" ~ "=" ~ ( |
| (integer ~ ":" ~ integer) | |
| (identifier ~ ":" ~ identifier) |
| )} |
| reserved_field = { "_reserved_" ~ ":" ~ integer } |
| array_field = { identifier ~ ":" ~ (integer|identifier) ~ |
| "[" ~ (size_modifier|integer)? ~ "]" |
| } |
| scalar_field = { identifier ~ ":" ~ integer } |
| typedef_field = { identifier ~ ":" ~ identifier } |
| group_field = { identifier ~ ("{" ~ constraint_list ~ "}")? } |
| |
| field = _{ |
| checksum_field | |
| padding_field | |
| size_field | |
| count_field | |
| elementsize_field | |
| body_field | |
| payload_field | |
| fixed_field | |
| reserved_field | |
| array_field | |
| scalar_field | |
| typedef_field | |
| group_field |
| } |
| field_list = { field ~ ("," ~ field)* ~ ","? } |
| |
| packet_declaration = { |
| "packet" ~ identifier ~ |
| (":" ~ identifier)? ~ |
| ("(" ~ constraint_list ~ ")")? ~ |
| "{" ~ |
| field_list? ~ |
| "}" |
| } |
| |
| struct_declaration = { |
| "struct" ~ identifier ~ |
| (":" ~ identifier)? ~ |
| ("(" ~ constraint_list ~ ")")? ~ |
| "{" ~ |
| field_list? ~ |
| "}" |
| } |
| |
| group_declaration = { |
| "group" ~ identifier ~ "{" ~ field_list ~ "}" |
| } |
| |
| checksum_declaration = { |
| "checksum" ~ identifier ~ ":" ~ integer ~ string |
| } |
| |
| custom_field_declaration = { |
| "custom_field" ~ identifier ~ (":" ~ integer)? ~ string |
| } |
| |
| test_case = { string } |
| test_case_list = _{ test_case ~ ("," ~ test_case)* ~ ","? } |
| test_declaration = { |
| "test" ~ identifier ~ "{" ~ |
| test_case_list ~ |
| "}" |
| } |
| |
| declaration = _{ |
| enum_declaration | |
| packet_declaration | |
| struct_declaration | |
| group_declaration | |
| checksum_declaration | |
| custom_field_declaration | |
| test_declaration |
| } |
| |
| file = { |
| SOI ~ |
| endianness_declaration ~ |
| declaration* ~ |
| EOI |
| } |