2 # Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
3 # Published under the GNU GPL
17 %left NEG DEREF ADDROF INV
22 | TEXT { "\"$_[1]\"" }
24 | exp '.' VAR { "$_[1].$_[3]" }
25 | VAR { $_[0]->Lookup($_[1]) }
26 | '*' exp %prec DEREF { $_[0]->Dereference($_[2]); "*$_[2]" }
27 | '~' exp %prec INV { "~$_[2]" }
28 | exp '+' exp { "$_[1] + $_[3]" }
29 | exp '-' exp { "$_[1] - $_[3]" }
30 | exp '*' exp { "$_[1] * $_[3]" }
31 | exp '%' exp { "$_[1] % $_[3]" }
32 | exp '<' exp { "$_[1] < $_[3]" }
33 | exp '>' exp { "$_[1] > $_[3]" }
34 | exp '|' exp { "$_[1] | $_[3]" }
35 | exp '==' exp { "$_[1] == $_[3]" }
36 | exp '<=' exp { "$_[1] <= $_[3]" }
37 | exp '=>' exp { "$_[1] => $_[3]" }
38 | exp '<<' exp { "$_[1] << $_[3]" }
39 | exp '>>' exp { "$_[1] >> $_[3]" }
40 | exp '!=' exp { "$_[1] != $_[3]" }
41 | exp '||' exp { "$_[1] || $_[3]" }
42 | exp '&&' exp { "$_[1] && $_[3]" }
43 | exp '&' exp { "$_[1] & $_[3]" }
44 | exp '->' VAR { $_[1]."->".$_[3] }
45 | exp '?' exp ':' exp { "$_[1]?$_[3]:$_[5]" }
46 | '~' exp { "~$_[1]" }
47 | '!' exp { "not $_[1]" }
48 | exp '/' exp { "$_[1] / $_[3]" }
49 | '-' exp %prec NEG { "-$_[2]" }
50 | '&' exp %prec ADDROF { "&$_[2]" }
51 | exp '^' exp { "$_[1]^$_[3]" }
52 | '(' exp ')' { "($_[2])" }
55 func: VAR '(' opt_args ')' { "$_[1]($_[3])" };
56 opt_args: { "" } | args;
57 args: exp | exp ',' args { "$_[1], $_[3]" };
61 package Parse::Pidl::Expr;
66 $parser->YYData->{INPUT}=~s/^[ \t]//;
68 for ($parser->YYData->{INPUT}) {
69 if (s/^(0x[0-9A-Fa-f]+)//) {
70 $parser->YYData->{LAST_TOKEN} = $1;
73 if (s/^([0-9]+(?:\.[0-9]+)?)//) {
74 $parser->YYData->{LAST_TOKEN} = $1;
77 if (s/^([A-Za-z_][A-Za-z0-9_]*)//) {
78 $parser->YYData->{LAST_TOKEN} = $1;
82 $parser->YYData->{LAST_TOKEN} = $1;
85 if (s/^(==|!=|<=|>=|->|\|\||<<|>>|&&)//s) {
86 $parser->YYData->{LAST_TOKEN} = $1;
90 $parser->YYData->{LAST_TOKEN} = $1;
99 return $self->YYData->{LOOKUP}->($x);
105 if (defined($self->YYData->{DEREFERENCE})) {
106 $self->YYData->{DEREFERENCE}->($x);
111 my($self, $data, $error, $lookup, $deref) = @_;
112 $self->YYData->{INPUT} = $data;
113 $self->YYData->{LOOKUP} = $lookup;
114 $self->YYData->{DEREFERENCE} = $deref;
115 return $self->YYParse( yylex => \&_Lexer, yyerror => $error );