1 // A Lark grammar for the XDR specification language based on 2 // https://tools.ietf.org/html/rfc4506 Section 6.3 3 4 declaration : "opaque" identifier "[" value "]" -> fixed_length_opaque 5 | "opaque" identifier "<" [ value ] ">" -> variable_length_opaque 6 | "string" identifier "<" [ value ] ">" -> variable_length_string 7 | type_specifier identifier "[" value "]" -> fixed_length_array 8 | type_specifier identifier "<" [ value ] ">" -> variable_length_array 9 | type_specifier "*" identifier -> optional_data 10 | type_specifier identifier -> basic 11 | "void" -> void 12 13 value : decimal_constant 14 | hexadecimal_constant 15 | octal_constant 16 | identifier 17 18 constant : decimal_constant | hexadecimal_constant | octal_constant 19 20 type_specifier : unsigned_hyper 21 | unsigned_long 22 | unsigned_int 23 | hyper 24 | long 25 | int 26 | float 27 | double 28 | quadruple 29 | bool 30 | enum_type_spec 31 | struct_type_spec 32 | union_type_spec 33 | identifier 34 35 unsigned_hyper : "unsigned" "hyper" 36 unsigned_long : "unsigned" "long" 37 unsigned_int : "unsigned" "int" 38 hyper : "hyper" 39 long : "long" 40 int : "int" 41 float : "float" 42 double : "double" 43 quadruple : "quadruple" 44 bool : "bool" 45 46 enum_type_spec : "enum" enum_body 47 48 enum_body : "{" ( identifier "=" value ) ( "," identifier "=" value )* "}" 49 50 struct_type_spec : "struct" struct_body 51 52 struct_body : "{" ( declaration ";" )+ "}" 53 54 union_type_spec : "union" union_body 55 56 union_body : switch_spec "{" case_spec+ [ default_spec ] "}" 57 58 switch_spec : "switch" "(" declaration ")" 59 60 case_spec : ( "case" value ":" )+ declaration ";" 61 62 default_spec : "default" ":" declaration ";" 63 64 constant_def : "const" identifier "=" value ";" 65 66 type_def : "typedef" declaration ";" -> typedef 67 | "enum" identifier enum_body ";" -> enum 68 | "struct" identifier struct_body ";" -> struct 69 | "union" identifier union_body ";" -> union 70 71 specification : definition* 72 73 definition : constant_def 74 | type_def 75 | program_def 76 | pragma_def 77 78 // 79 // RPC program definitions not specified in RFC 4506 80 // 81 82 program_def : "program" identifier "{" version_def+ "}" "=" constant ";" 83 84 version_def : "version" identifier "{" procedure_def+ "}" "=" constant ";" 85 86 procedure_def : type_specifier identifier "(" type_specifier ")" "=" constant ";" 87 88 pragma_def : "pragma" directive identifier [ identifier ] ";" 89 90 directive : exclude_directive 91 | header_directive 92 | pages_directive 93 | public_directive 94 | skip_directive 95 96 exclude_directive : "exclude" 97 header_directive : "header" 98 pages_directive : "pages" 99 public_directive : "public" 100 skip_directive : "skip" 101 102 // 103 // XDR language primitives 104 // 105 106 identifier : /([a-z]|[A-Z])(_|[a-z]|[A-Z]|[0-9])*/ 107 108 decimal_constant : /[\+-]?(0|[1-9][0-9]*)/ 109 hexadecimal_constant : /0x([a-f]|[A-F]|[0-9])+/ 110 octal_constant : /0[0-7]+/ 111 112 PASSTHRU : "%" | "%" /.+/ 113 %ignore PASSTHRU 114 115 %import common.C_COMMENT 116 %ignore C_COMMENT 117 118 %import common.WS 119 %ignore WS
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.