Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / tools / net / sunrpc / xdrgen / grammars / xdr.lark
blob7c2c1b8c86d126618cedd90e5667f57b7c012220
1 // A Lark grammar for the XDR specification language based on
2 // https://tools.ietf.org/html/rfc4506 Section 6.3
4 declaration             : "opaque" identifier "[" value "]"            -> fixed_length_opaque
5                         | "opaque" identifier "<" [ value ] ">"        -> variable_length_opaque
6                         | "string" identifier "<" [ value ] ">"        -> 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
13 value                   : decimal_constant
14                         | hexadecimal_constant
15                         | octal_constant
16                         | identifier
18 constant                : decimal_constant | hexadecimal_constant | octal_constant
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
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"
46 enum_type_spec          : "enum" enum_body
48 enum_body               : "{" ( identifier "=" value ) ( "," identifier "=" value )* "}"
50 struct_type_spec        : "struct" struct_body
52 struct_body             : "{" ( declaration ";" )+ "}"
54 union_type_spec         : "union" union_body
56 union_body              : switch_spec "{" case_spec+ [ default_spec ] "}"
58 switch_spec             : "switch" "(" declaration ")"
60 case_spec               : ( "case" value ":" )+ declaration ";"
62 default_spec            : "default" ":" declaration ";"
64 constant_def            : "const" identifier "=" value ";"
66 type_def                : "typedef" declaration ";"                -> typedef
67                         | "enum" identifier enum_body ";"          -> enum
68                         | "struct" identifier struct_body ";"      -> struct
69                         | "union" identifier union_body ";"        -> union
71 specification           : definition*
73 definition              : constant_def
74                         | type_def
75                         | program_def
76                         | pragma_def
79 // RPC program definitions not specified in RFC 4506
82 program_def             : "program" identifier "{" version_def+ "}" "=" constant ";"
84 version_def             : "version" identifier "{" procedure_def+ "}" "=" constant ";"
86 procedure_def           : type_specifier identifier "(" type_specifier ")" "=" constant ";"
88 pragma_def              : "pragma" directive identifier [ identifier ] ";"
90 directive               : big_endian_directive
91                         | exclude_directive
92                         | header_directive
93                         | pages_directive
94                         | public_directive
95                         | skip_directive
97 big_endian_directive    : "big_endian"
98 exclude_directive       : "exclude"
99 header_directive        : "header"
100 pages_directive         : "pages"
101 public_directive        : "public"
102 skip_directive          : "skip"
105 // XDR language primitives
108 identifier              : /([a-z]|[A-Z])(_|[a-z]|[A-Z]|[0-9])*/
110 decimal_constant        : /[\+-]?(0|[1-9][0-9]*)/
111 hexadecimal_constant    : /0x([a-f]|[A-F]|[0-9])+/
112 octal_constant          : /0[0-7]+/
114 PASSTHRU                : "%" | "%" /.+/
115 %ignore PASSTHRU
117 %import common.C_COMMENT
118 %ignore C_COMMENT
120 %import common.WS
121 %ignore WS