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]
79 array_len: '[' <commit> constant ']'
83 element_list1: base_element(s? /;/) ';'
87 | base_element(s? /,/)
92 property_list: '[' <commit> property(s /,/) ']'
103 | 'byte_count_pointer' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
104 | 'size_is' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
105 | 'length_is' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
106 | 'switch_is' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
107 | 'switch_type' '(' type ')' {{ "$item[1]" => $item{type} }}
111 expression: /[\w?\/+*-]+/
113 function : type identifier '(' <commit> element_list2 ');'
115 "TYPE" => "FUNCTION",
116 "NAME" => $item{identifier},
117 "RETURN_TYPE" => $item{type},
118 "DATA" => $item{element_list2}
123 'unsigned' type { "$item[1] $item[2]" }
124 | 'long' { $item[1] }
125 | 'string' { $item[1] }
126 | 'wchar_t' { $item[1] }
127 | struct { $item[1] }
129 | identifier { $item[1] }