📄 idl.pm
字号:
}, {#State 220 DEFAULT => -26 }, {#State 221 DEFAULT => -79 }], yyrules =>[ [#Rule 0 '$start', 2, undef ], [#Rule 1 'idl', 0, undef ], [#Rule 2 'idl', 2,sub#line 19 "idl.yp"{ push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 3 'idl', 2,sub#line 20 "idl.yp"{ push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 4 'idl', 2,sub#line 21 "idl.yp"{ push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 5 'idl', 2,sub#line 22 "idl.yp"{ push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 6 'idl', 2,sub#line 23 "idl.yp"{ push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 7 'idl', 2,sub#line 24 "idl.yp"{ push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 8 'import', 3,sub#line 27 "idl.yp"{{ "TYPE" => "IMPORT", "PATHS" => $_[2], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE} }} ], [#Rule 9 'include', 3,sub#line 34 "idl.yp"{{ "TYPE" => "INCLUDE", "PATHS" => $_[2], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE} }} ], [#Rule 10 'importlib', 3,sub#line 41 "idl.yp"{{ "TYPE" => "IMPORTLIB", "PATHS" => $_[2], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE} }} ], [#Rule 11 'commalist', 1,sub#line 50 "idl.yp"{ [ $_[1] ] } ], [#Rule 12 'commalist', 3,sub#line 51 "idl.yp"{ push(@{$_[1]}, $_[3]); $_[1] } ], [#Rule 13 'coclass', 7,sub#line 55 "idl.yp"{{ "TYPE" => "COCLASS", "PROPERTIES" => $_[1], "NAME" => $_[3], "DATA" => $_[5], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} ], [#Rule 14 'interface_names', 0, undef ], [#Rule 15 'interface_names', 4,sub#line 67 "idl.yp"{ push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 16 'interface', 7,sub#line 71 "idl.yp"{{ "TYPE" => "INTERFACE", "PROPERTIES" => $_[1], "NAME" => $_[3], "DATA" => $_[5], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} ], [#Rule 17 'cpp_quote', 4,sub#line 82 "idl.yp"{{ "TYPE" => "CPP_QUOTE", "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, "DATA" => $_[3] }} ], [#Rule 18 'definitions', 1,sub#line 91 "idl.yp"{ [ $_[1] ] } ], [#Rule 19 'definitions', 2,sub#line 92 "idl.yp"{ push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 20 'definition', 1, undef ], [#Rule 21 'definition', 1, undef ], [#Rule 22 'definition', 1, undef ], [#Rule 23 'definition', 1, undef ], [#Rule 24 'definition', 1, undef ], [#Rule 25 'const', 7,sub#line 100 "idl.yp"{{ "TYPE" => "CONST", "DTYPE" => $_[2], "POINTERS" => $_[3], "NAME" => $_[4], "VALUE" => $_[6], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} ], [#Rule 26 'const', 8,sub#line 110 "idl.yp"{{ "TYPE" => "CONST", "DTYPE" => $_[2], "POINTERS" => $_[3], "NAME" => $_[4], "ARRAY_LEN" => $_[5], "VALUE" => $_[7], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} ], [#Rule 27 'function', 7,sub#line 124 "idl.yp"{{ "TYPE" => "FUNCTION", "NAME" => $_[3], "RETURN_TYPE" => $_[2], "PROPERTIES" => $_[1], "ELEMENTS" => $_[5], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} ], [#Rule 28 'declare', 4,sub#line 136 "idl.yp"{{ "TYPE" => "DECLARE", "NAME" => $_[3], "DATA" => $_[2], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} ], [#Rule 29 'decl_type', 1, undef ], [#Rule 30 'decl_type', 1, undef ], [#Rule 31 'decl_type', 1, undef ], [#Rule 32 'decl_enum', 2,sub#line 149 "idl.yp"{{ "TYPE" => "ENUM", "PROPERTIES" => $_[1] }} ], [#Rule 33 'decl_bitmap', 2,sub#line 156 "idl.yp"{{ "TYPE" => "BITMAP", "PROPERTIES" => $_[1] }} ], [#Rule 34 'decl_union', 2,sub#line 163 "idl.yp"{{ "TYPE" => "UNION", "PROPERTIES" => $_[1] }} ], [#Rule 35 'typedef', 6,sub#line 170 "idl.yp"{{ "TYPE" => "TYPEDEF", "PROPERTIES" => $_[1], "NAME" => $_[4], "DATA" => $_[3], "ARRAY_LEN" => $_[5], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} ], [#Rule 36 'usertype', 1, undef ], [#Rule 37 'usertype', 1, undef ], [#Rule 38 'usertype', 1, undef ], [#Rule 39 'usertype', 1, undef ], [#Rule 40 'typedecl', 2,sub#line 183 "idl.yp"{ $_[1] } ], [#Rule 41 'sign', 1, undef ], [#Rule 42 'sign', 1, undef ], [#Rule 43 'existingtype', 2,sub#line 188 "idl.yp"{ ($_[1]?$_[1]:"signed") ." $_[2]" } ], [#Rule 44 'existingtype', 1, undef ], [#Rule 45 'type', 1, undef ], [#Rule 46 'type', 1, undef ], [#Rule 47 'type', 1,sub#line 192 "idl.yp"{ "void" } ], [#Rule 48 'enum_body', 3,sub#line 194 "idl.yp"{ $_[2] } ], [#Rule 49 'opt_enum_body', 0, undef ], [#Rule 50 'opt_enum_body', 1, undef ], [#Rule 51 'enum', 4,sub#line 197 "idl.yp"{{ "TYPE" => "ENUM", "PROPERTIES" => $_[1], "NAME" => $_[3], "ELEMENTS" => $_[4] }} ], [#Rule 52 'enum_elements', 1,sub#line 206 "idl.yp"{ [ $_[1] ] } ], [#Rule 53 'enum_elements', 3,sub#line 207 "idl.yp"{ push(@{$_[1]}, $_[3]); $_[1] } ], [#Rule 54 'enum_element', 1, undef ], [#Rule 55 'enum_element', 3,sub#line 211 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 56 'bitmap_body', 3,sub#line 214 "idl.yp"{ $_[2] } ], [#Rule 57 'opt_bitmap_body', 0, undef ], [#Rule 58 'opt_bitmap_body', 1, undef ], [#Rule 59 'bitmap', 4,sub#line 217 "idl.yp"{{ "TYPE" => "BITMAP", "PROPERTIES" => $_[1], "NAME" => $_[3], "ELEMENTS" => $_[4] }} ], [#Rule 60 'bitmap_elements', 1,sub#line 226 "idl.yp"{ [ $_[1] ] } ], [#Rule 61 'bitmap_elements', 3,sub#line 227 "idl.yp"{ push(@{$_[1]}, $_[3]); $_[1] } ], [#Rule 62 'opt_bitmap_elements', 0, undef ], [#Rule 63 'opt_bitmap_elements', 1, undef ], [#Rule 64 'bitmap_element', 3,sub#line 232 "idl.yp"{ "$_[1] ( $_[3] )" } ], [#Rule 65 'struct_body', 3,sub#line 235 "idl.yp"{ $_[2] } ], [#Rule 66 'opt_struct_body', 0, undef ], [#Rule 67 'opt_struct_body', 1, undef ], [#Rule 68 'struct', 4,sub#line 239 "idl.yp"{{ "TYPE" => "STRUCT", "PROPERTIES" => $_[1], "NAME" => $_[3], "ELEMENTS" => $_[4] }} ], [#Rule 69 'empty_element', 2,sub#line 248 "idl.yp"{{ "NAME" => "", "TYPE" => "EMPTY", "PROPERTIES" => $_[1], "POINTERS" => 0, "ARRAY_LEN" => [], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} ], [#Rule 70 'base_or_empty', 2, undef ], [#Rule 71 'base_or_empty', 1, undef ], [#Rule 72 'optional_base_element', 2,sub#line 262 "idl.yp"{ $_[2]->{PROPERTIES} = FlattenHash([$_[1],$_[2]->{PROPERTIES}]); $_[2] } ], [#Rule 73 'union_elements', 0, undef ], [#Rule 74 'union_elements', 2,sub#line 267 "idl.yp"{ push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 75 'union_body', 3,sub#line 270 "idl.yp"{ $_[2] } ], [#Rule 76 'opt_union_body', 0, undef ], [#Rule 77 'opt_union_body', 1, undef ], [#Rule 78 'union', 4,sub#line 274 "idl.yp"{{ "TYPE" => "UNION", "PROPERTIES" => $_[1], "NAME" => $_[3], "ELEMENTS" => $_[4] }} ], [#Rule 79 'base_element', 5,sub#line 283 "idl.yp"{{ "NAME" => $_[4], "TYPE" => $_[2], "PROPERTIES" => $_[1], "POINTERS" => $_[3], "ARRAY_LEN" => $_[5], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} ], [#Rule 80 'pointers', 0,sub#line 297 "idl.yp"{ 0 } ], [#Rule 81 'pointers', 2,sub#line 298 "idl.yp"{ $_[1]+1 } ], [#Rule 82 'element_list1', 0,sub#line 302 "idl.yp"{ [] } ], [#Rule 83 'element_list1', 3,sub#line 303 "idl.yp"{ push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 84 'element_list2', 0, undef ], [#Rule 85 'element_list2', 1, undef ], [#Rule 86 'element_list2', 1,sub#line 309 "idl.yp"{ [ $_[1] ] } ], [#Rule 87 'element_list2', 3,sub#line 310 "idl.yp"{ push(@{$_[1]}, $_[3]); $_[1] } ], [#Rule 88 'array_len', 0, undef ], [#Rule 89 'array_len', 3,sub#line 315 "idl.yp"{ push(@{$_[3]}, "*"); $_[3] } ], [#Rule 90 'array_len', 4,sub#line 316 "idl.yp"{ push(@{$_[4]}, "$_[2]"); $_[4] } ], [#Rule 91 'property_list', 0, undef ], [#Rule 92 'property_list', 4,sub#line 322 "idl.yp"{ FlattenHash([$_[1],$_[3]]); } ], [#Rule 93 'properties', 1,sub#line 325 "idl.yp"{ $_[1] } ], [#Rule 94 'properties', 3,sub#line 326 "idl.yp"{ FlattenHash([$_[1], $_[3]]); } ], [#Rule 95 'property', 1,sub#line 329 "idl.yp"{{ "$_[1]" => "1" }} ], [#Rule 96 'property', 4,sub#line 330 "idl.yp"{{ "$_[1]" => "$_[3]" }} ], [#Rule 97 'listtext', 1, undef ], [#Rule 98 'listtext', 3,sub#line 335 "idl.yp"{ "$_[1] $_[3]" } ], [#Rule 99 'commalisttext', 1, undef ], [#Rule 100 'commalisttext', 3,sub#line 340 "idl.yp"{ "$_[1],$_[3]" } ], [#Rule 101 'anytext', 0,sub#line 344 "idl.yp"{ "" } ], [#Rule 102 'anytext', 1, undef ], [#Rule 103 'anytext', 1, undef ], [#Rule 104 'anytext', 1, undef ], [#Rule 105 'anytext', 3,sub#line 346 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 106 'anytext', 3,sub#line 347 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 107 'anytext', 3,sub#line 348 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 108 'anytext', 3,sub#line 349 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 109 'anytext', 3,sub#line 350 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 110 'anytext', 3,sub#line 351 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 111 'anytext', 3,sub#line 352 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 112 'anytext', 3,sub#line 353 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 113 'anytext', 3,sub#line 354 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 114 'anytext', 3,sub#line 355 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 115 'anytext', 3,sub#line 356 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 116 'anytext', 3,sub#line 357 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 117 'anytext', 3,sub#line 358 "idl.yp"{ "$_[1]$_[2]$_[3]" } ], [#Rule 118 'anytext', 5,sub#line 359 "idl.yp"{ "$_[1]$_[2]$_[3]$_[4]$_[5]" } ], [#Rule 119 'anytext', 5,sub#line 360 "idl.yp"{ "$_[1]$_[2]$_[3]$_[4]$_[5]" } ], [#Rule 120 'identifier', 1, undef ], [#Rule 121 'optional_identifier', 1, undef ], [#Rule 122 'optional_identifier', 0, undef ], [#Rule 123 'constant', 1, undef ], [#Rule 124 'text', 1,sub#line 374 "idl.yp"{ "\"$_[1]\"" } ], [#Rule 125 'optional_semicolon', 0, undef ], [#Rule 126 'optional_semicolon', 1, undef ]], @_); bless($self,$class);}#line 385 "idl.yp"use Parse::Pidl qw(error);###################################################################### flatten an array of hashes into a single hashsub FlattenHash($) { my $a = shift; my %b; for my $d (@{$a}) { for my $k (keys %{$d}) { $b{$k} = $d->{$k}; } } return \%b;}###################################################################### traverse a perl data structure removing any empty arrays or# hashes and any hash elements that map to undefsub CleanData($){ sub CleanData($); my($v) = shift; return undef if (not defined($v)); if (ref($v) eq "ARRAY") { foreach my $i (0 .. $#{$v}) { CleanData($v->[$i]); } # this removes any undefined elements from the array @{$v} = grep { defined $_ } @{$v}; } elsif (ref($v) eq "HASH") { foreach my $x (keys %{$v}) { CleanData($v->{$x}); if (!defined $v->{$x}) { delete($v->{$x}); next; } } } return $v;}sub _Error { if (exists $_[0]->YYData->{ERRMSG}) { error($_[0]->YYData, $_[0]->YYData->{ERRMSG}); delete $_[0]->YYData->{ERRMSG}; return; }; my $last_token = $_[0]->YYData->{LAST_TOKEN}; error($_[0]->YYData, "Syntax error near '$last_token'");}sub _Lexer($){ my($parser)=shift; $parser->YYData->{INPUT} or return('',undef);again: $parser->YYData->{INPUT} =~ s/^[ \t]*//; for ($parser->YYData->{INPUT}) { if (/^\#/) { if (s/^\# (\d+) \"(.*?)\"( \d+|)//) { $parser->YYData->{LINE} = $1-1; $parser->YYData->{FILE} = $2; goto again; } if (s/^\#line (\d+) \"(.*?)\"( \d+|)//) { $parser->YYData->{LINE} = $1-1; $parser->YYData->{FILE} = $2; goto again; } if (s/^(\#.*)$//m) { goto again; } } if (s/^(\n)//) { $parser->YYData->{LINE}++; goto again; } if (s/^\"(.*?)\"//) { $parser->YYData->{LAST_TOKEN} = $1; return('TEXT',$1); } if (s/^(\d+)(\W|$)/$2/) { $parser->YYData->{LAST_TOKEN} = $1; return('CONSTANT',$1); } if (s/^([\w_]+)//) { $parser->YYData->{LAST_TOKEN} = $1; if ($1 =~ /^(coclass|interface|const|typedef|declare|union|cpp_quote |struct|enum|bitmap|void|unsigned|signed|import|include |importlib)$/x) { return $1; } return('IDENTIFIER',$1); } if (s/^(.)//s) { $parser->YYData->{LAST_TOKEN} = $1; return($1,$1); } }}sub parse_string{ my ($data,$filename) = @_; my $self = new Parse::Pidl::IDL; $self->YYData->{FILE} = $filename; $self->YYData->{INPUT} = $data; $self->YYData->{LINE} = 0; $self->YYData->{LAST_TOKEN} = "NONE"; my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error ); return CleanData($idl);}sub parse_file($$){ my ($filename,$incdirs) = @_; my $saved_delim = $/; undef $/; my $cpp = $ENV{CPP}; if (! defined $cpp) { $cpp = "cpp"; } my $includes = join('',map { " -I$_" } @$incdirs); my $data = `$cpp -D__PIDL__$includes -xc $filename`; $/ = $saved_delim; return parse_string($data, $filename);}1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -