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 : typedef { $item[1] }
29 | function { $item[1] }
31 typedef : 'typedef' <commit> type identifier array_len(?) ';'
34 "NAME" => $item{identifier},
35 "DATA" => $item{type},
36 "ARRAY_LEN" => $item{array_len}[0]
40 struct: 'struct' <commit> '{' element_list1(?) '}'
43 "ELEMENTS" => util::FlattenArray($item{element_list1})
47 union: property_list(s?) 'union' <commit> '{' union_element(s?) '}'
50 "PROPERTIES" => util::FlattenArray($item[1]),
51 "DATA" => $item{union_element}
55 union_element: '[case(' constant ')]' base_element ';'
57 "TYPE" => "UNION_ELEMENT",
58 "CASE" => $item{constant},
59 "DATA" => $item{base_element}
61 | 'case(' constant ')' base_element ';'
63 "TYPE" => "UNION_ELEMENT",
64 "CASE" => $item{constant},
65 "DATA" => $item{base_element}
68 base_element: property_list(s?) type pointer(s?) identifier array_len(?)
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]
78 array_len: '[' <commit> constant ']'
82 element_list1: base_element(s? /;/) ';'
86 | base_element(s? /,/)
91 property_list: '[' <commit> property(s /,/) ']'
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} }}
110 expression: /[\w?\/+*-]+/
112 function : type identifier '(' <commit> element_list2 ');'
114 "TYPE" => "FUNCTION",
115 "NAME" => $item{identifier},
116 "RETURN_TYPE" => $item{type},
117 "DATA" => $item{element_list2}
122 'unsigned' type { "$item[1] $item[2]" }
123 | 'long' { $item[1] }
124 | 'string' { $item[1] }
125 | 'wchar_t' { $item[1] }
126 | struct { $item[1] }
128 | identifier { $item[1] }