5 idl: cpp_prefix(s?) module_header interface
6 { [$item{module_header}, $item{interface}] }
9 module_header: '[' <commit> module_param(s /,/) ']'
11 "TYPE" => "MODULEHEADER",
12 "DATA" => util::FlattenHash($item[3])
16 module_param: identifier '(' text ')'
17 {{ "$item{identifier}" => "$item{text}" }}
20 interface: 'interface' <commit> identifier '{' definition(s?) '}'
22 "TYPE" => "INTERFACE",
23 "NAME" => $item{identifier},
28 definition : cpp_prefix
29 | typedef { $item[1] }
30 | function { $item[1] }
32 typedef : 'typedef' <commit> type identifier array_len(?) ';'
35 "NAME" => $item{identifier},
36 "DATA" => $item{type},
37 "ARRAY_LEN" => $item[5][0]
41 struct: 'struct' <commit> '{' element_list1(?) '}'
44 "ELEMENTS" => util::FlattenArray2($item[4])
48 union: property_list(s?) 'union' <commit> '{' union_element(s?) '}'
51 "PROPERTIES" => util::FlattenArray($item[1]),
56 union_element: '[' 'case' '(' constant ')' ']' base_element ';'
58 "TYPE" => "UNION_ELEMENT",
59 "CASE" => $item{constant},
60 "DATA" => $item{base_element}
62 | 'case' '(' constant ')' base_element ';'
64 "TYPE" => "UNION_ELEMENT",
65 "CASE" => $item{constant},
66 "DATA" => $item{base_element}
69 base_element: property_list(s?) type pointer(s?) identifier array_len(?)
71 "NAME" => $item{identifier},
72 "TYPE" => $item{type},
73 "PROPERTIES" => util::FlattenArray($item[1]),
74 "POINTERS" => $#{$item[3]}==-1?undef:$#{$item[3]}+1,
75 "ARRAY_LEN" => $item[5][0]
82 | '[' <commit> constant ']'
86 element_list1: base_element(s? /;/) ';'
90 | base_element(s? /,/)
95 property_list: '[' <commit> property(s /,/) ']'
106 | 'byte_count_pointer' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
107 | 'size_is' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
108 | 'length_is' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
109 | 'switch_is' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
110 | 'value' '(' anytext ')' {{ "$item[1]" => "$item{anytext}" }}
111 | 'switch_type' '(' type ')' {{ "$item[1]" => $item{type} }}
115 expression: /[\w.?\/+*-_]+/
117 function : type identifier '(' <commit> element_list2 ');'
119 "TYPE" => "FUNCTION",
120 "NAME" => $item{identifier},
121 "RETURN_TYPE" => $item{type},
122 "DATA" => $item{element_list2}
127 'unsigned' type { "$item[1] $item[2]" }
128 | 'long' { $item[1] }
129 | 'string' { $item[1] }
130 | 'wchar_t' { $item[1] }
131 | struct { $item[1] }
133 | identifier { $item[1] }
141 call: expression '(' <commit> expression ')'
142 {{ "$item[1]($item[4])" }}