%%
idl:
#empty { {} }
- | idl interface { push(@{$_[1]}, $_[2]); $_[1] }
+ | idl interface { push(@{$_[1]}, $_[2]); $_[1] }
| idl coclass { push(@{$_[1]}, $_[2]); $_[1] }
;
coclass: property_list 'coclass' identifier '{' interfaces '}' optional_semicolon
{$_[3] => {
"TYPE" => "COCLASS",
- "PROPERTIES" => $_[1],
- "NAME" => $_[3],
- "DATA" => $_[5],
+ "PROPERTIES" => $_[1],
+ "NAME" => $_[3],
+ "DATA" => $_[5],
}}
;
interface: property_list 'interface' identifier base_interface '{' definitions '}' optional_semicolon
{$_[3] => {
"TYPE" => "INTERFACE",
- "PROPERTIES" => $_[1],
- "NAME" => $_[3],
- "BASE" => $_[4],
- "DATA" => $_[6],
+ "PROPERTIES" => $_[1],
+ "NAME" => $_[3],
+ "BASE" => $_[4],
+ "DATA" => $_[6],
}}
;
"NAME" => $_[3],
"VALUE" => $_[5]
}}
+ | 'const' identifier identifier array_len '=' anytext ';'
+ {{
+ "TYPE" => "CONST",
+ "DTYPE" => $_[2],
+ "NAME" => $_[3],
+ "ARRAY_LEN" => $_[4],
+ "VALUE" => $_[6],
+ }}
;
}}
;
-typedef: 'typedef' type identifier array_len ';'
+typedef: 'typedef' property_list type identifier array_len ';'
{{
- "TYPE" => "TYPEDEF",
- "NAME" => $_[3],
- "DATA" => $_[2],
- "ARRAY_LEN" => $_[4]
+ "TYPE" => "TYPEDEF",
+ "PROPERTIES" => $_[2],
+ "NAME" => $_[4],
+ "DATA" => $_[3],
+ "ARRAY_LEN" => $_[5]
}}
;
-type: struct | union | enum | identifier
+type: struct | union | enum | bitmap | identifier
| void { "void" }
;
| identifier '=' anytext { "$_[1]$_[2]$_[3]" }
;
-struct: property_list 'struct' '{' element_list1 '}'
+bitmap: 'bitmap' '{' bitmap_elements '}'
+ {{
+ "TYPE" => "BITMAP",
+ "ELEMENTS" => $_[3]
+ }}
+;
+
+bitmap_elements:
+ bitmap_element { [ $_[1] ] }
+ | bitmap_elements ',' bitmap_element { push(@{$_[1]}, $_[3]); $_[1] }
+;
+
+bitmap_element: identifier '=' anytext { "$_[1] ( $_[3] )" }
+;
+
+struct: 'struct' '{' element_list1 '}'
{{
"TYPE" => "STRUCT",
- "PROPERTIES" => $_[1],
- "ELEMENTS" => $_[4]
+ "ELEMENTS" => $_[3]
}}
;
-union: property_list 'union' '{' union_elements '}'
+union: 'union' '{' union_elements '}'
{{
"TYPE" => "UNION",
- "PROPERTIES" => $_[1],
- "DATA" => $_[4]
+ "DATA" => $_[3]
}}
;
| anytext '/' anytext { "$_[1]$_[2]$_[3]" }
| anytext '+' anytext { "$_[1]$_[2]$_[3]" }
| anytext '(' commalisttext ')' anytext { "$_[1]$_[2]$_[3]$_[4]$_[5]" }
+ | anytext '{' commalisttext '}' anytext { "$_[1]$_[2]$_[3]$_[4]$_[5]" }
;
identifier: IDENTIFIER
$parser->YYData->{LAST_TOKEN} = $1;
if ($1 =~
/^(coclass|interface|const|typedef|union
- |struct|enum|void|case|default)$/x) {
+ |struct|enum|bitmap|void|case|default)$/x) {
return $1;
}
return('IDENTIFIER',$1);