first version
[samba.git] / source4 / build / pidl / idl.gram
1 {
2         use util;
3 }
4
5 idl: cpp_prefix(s?) module_header interface 
6    { [$item{module_header}, $item{interface}] }
7    | <error>
8
9 module_header: '[' <commit> module_param(s /,/) ']' 
10           {{ 
11               "TYPE" => "MODULEHEADER", 
12               "DATA" => util::FlattenHash($item[3])
13           }}
14               | <error?>
15
16 module_param: identifier '(' text ')'
17           {{ "$item{identifier}" => "$item{text}" }}
18           | <error>
19
20 interface: 'interface' <commit> identifier '{' definition(s?) '}' 
21           {{
22                        "TYPE" => "INTERFACE", 
23                        "NAME" => $item{identifier},
24                        "DATA" => $item[5]
25           }}
26           | <error?>
27
28 definition : typedef { $item[1] }
29              | function { $item[1] }
30
31 typedef : 'typedef' <commit> type identifier array_len(?) ';' 
32         {{
33                      "TYPE" => "TYPEDEF", 
34                      "NAME" => $item{identifier},
35                      "DATA" => $item{type},
36                      "ARRAY_LEN" => $item{array_len}[0]
37         }}
38         | <error?>
39
40 struct: 'struct' <commit> '{' element_list1(?) '}' 
41         {{
42                      "TYPE" => "STRUCT", 
43                      "ELEMENTS" => util::FlattenArray($item{element_list1})
44         }}
45       | <error?>
46
47 union: property_list(s?) 'union' <commit> '{' union_element(s?) '}' 
48          {{
49                 "TYPE" => "UNION",
50                 "PROPERTIES" => util::FlattenArray($item[1]),
51                 "DATA" => $item{union_element}
52          }}
53          | <error?>
54
55 union_element: '[case(' constant ')]' base_element ';'
56          {{
57                 "TYPE" => "UNION_ELEMENT",
58                 "CASE" => $item{constant},
59                 "DATA" => $item{base_element}
60          }}
61          | 'case(' constant ')' base_element ';'
62          {{
63                 "TYPE" => "UNION_ELEMENT",
64                 "CASE" => $item{constant},
65                 "DATA" => $item{base_element}
66          }}
67
68 base_element: property_list(s?) type pointer(s?) identifier array_len(?) 
69               {{
70                            "NAME" => $item{identifier},
71                            "TYPE" => $item{type},
72                            "PROPERTIES" => util::FlattenArray($item[1]),
73                            "POINTERS" => $#{$item{pointer}}==-1?undef:$#{$item{pointer}}+1,
74                            "ARRAY_LEN" => $item{array_len}[0]
75               }}
76             | <error>
77
78 array_len: '[' <commit> constant ']' 
79          { $item{constant} }
80          | <error?>
81
82 element_list1: base_element(s? /;/) ';' 
83                { $item[1] }
84
85 element_list2: 'void' 
86          | base_element(s? /,/)
87          { $item[1] }
88
89 pointer: '*'
90
91 property_list: '[' <commit> property(s /,/) ']' 
92               { $item[3] }
93              | <error?>
94
95 property: 'unique' 
96           | 'in,out'
97           | 'in'
98           | 'out'
99           | 'ref'
100           | 'context_handle'
101           | 'string'
102           | 'byte_count_pointer' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
103           | 'size_is' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
104           | 'length_is' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
105           | 'switch_is' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
106           | 'switch_type' '(' type ')' {{ "$item[1]" => $item{type} }}
107
108 identifier: /[\w?]+/
109
110 expression: /[\w?\/+*-]+/
111
112 function : type identifier '(' <commit> element_list2 ');' 
113          {{
114                 "TYPE" => "FUNCTION",
115                 "NAME" => $item{identifier},
116                 "RETURN_TYPE" => $item{type},
117                 "DATA" => $item{element_list2}
118          }}
119          | <error?>
120
121 type : 
122        'unsigned' type { "$item[1] $item[2]" }
123      | 'long'    { $item[1] }
124      | 'string'  { $item[1] }
125      | 'wchar_t' { $item[1] }
126      | struct    { $item[1] }
127      | union     { $item[1] }
128      | identifier { $item[1] }
129      | <error>
130
131 text: /[\w\s.?-]*/
132
133 constant: /-?\d+/
134
135 cpp_prefix: '#' /.*/