| // A Lark grammar for the XDR specification language based on |
| // https://tools.ietf.org/html/rfc4506 Section 6.3 |
| |
| declaration : "opaque" identifier "[" value "]" -> fixed_length_opaque |
| | "opaque" identifier "<" [ value ] ">" -> variable_length_opaque |
| | "string" identifier "<" [ value ] ">" -> variable_length_string |
| | type_specifier identifier "[" value "]" -> fixed_length_array |
| | type_specifier identifier "<" [ value ] ">" -> variable_length_array |
| | type_specifier "*" identifier -> optional_data |
| | type_specifier identifier -> basic |
| | "void" -> void |
| |
| value : decimal_constant |
| | hexadecimal_constant |
| | octal_constant |
| | identifier |
| |
| constant : decimal_constant | hexadecimal_constant | octal_constant |
| |
| type_specifier : unsigned_hyper |
| | unsigned_long |
| | unsigned_int |
| | hyper |
| | long |
| | int |
| | float |
| | double |
| | quadruple |
| | bool |
| | enum_type_spec |
| | struct_type_spec |
| | union_type_spec |
| | identifier |
| |
| unsigned_hyper : "unsigned" "hyper" |
| unsigned_long : "unsigned" "long" |
| unsigned_int : "unsigned" "int" |
| hyper : "hyper" |
| long : "long" |
| int : "int" |
| float : "float" |
| double : "double" |
| quadruple : "quadruple" |
| bool : "bool" |
| |
| enum_type_spec : "enum" enum_body |
| |
| enum_body : "{" ( identifier "=" value ) ( "," identifier "=" value )* "}" |
| |
| struct_type_spec : "struct" struct_body |
| |
| struct_body : "{" ( declaration ";" )+ "}" |
| |
| union_type_spec : "union" union_body |
| |
| union_body : switch_spec "{" case_spec+ [ default_spec ] "}" |
| |
| switch_spec : "switch" "(" declaration ")" |
| |
| case_spec : ( "case" value ":" )+ declaration ";" |
| |
| default_spec : "default" ":" declaration ";" |
| |
| constant_def : "const" identifier "=" value ";" |
| |
| type_def : "typedef" declaration ";" -> typedef |
| | "enum" identifier enum_body ";" -> enum |
| | "struct" identifier struct_body ";" -> struct |
| | "union" identifier union_body ";" -> union |
| |
| specification : definition* |
| |
| definition : constant_def |
| | type_def |
| | program_def |
| | pragma_def |
| |
| // |
| // RPC program definitions not specified in RFC 4506 |
| // |
| |
| program_def : "program" identifier "{" version_def+ "}" "=" constant ";" |
| |
| version_def : "version" identifier "{" procedure_def+ "}" "=" constant ";" |
| |
| procedure_def : type_specifier identifier "(" type_specifier ")" "=" constant ";" |
| |
| pragma_def : "pragma" directive identifier [ identifier ] ";" |
| |
| directive : exclude_directive |
| | header_directive |
| | pages_directive |
| | public_directive |
| | skip_directive |
| |
| exclude_directive : "exclude" |
| header_directive : "header" |
| pages_directive : "pages" |
| public_directive : "public" |
| skip_directive : "skip" |
| |
| // |
| // XDR language primitives |
| // |
| |
| identifier : /([a-z]|[A-Z])(_|[a-z]|[A-Z]|[0-9])*/ |
| |
| decimal_constant : /[\+-]?(0|[1-9][0-9]*)/ |
| hexadecimal_constant : /0x([a-f]|[A-F]|[0-9])+/ |
| octal_constant : /0[0-7]+/ |
| |
| PASSTHRU : "%" | "%" /.+/ |
| %ignore PASSTHRU |
| |
| %import common.C_COMMENT |
| %ignore C_COMMENT |
| |
| %import common.WS |
| %ignore WS |