From 8daa83a594a2e98f39d764422bfbdbc62c9efd44 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 19:20:00 +0200 Subject: Adding upstream version 2:4.20.0+dfsg. Signed-off-by: Daniel Baumann --- pidl/expr.yp | 202 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 pidl/expr.yp (limited to 'pidl/expr.yp') diff --git a/pidl/expr.yp b/pidl/expr.yp new file mode 100644 index 0000000..ef8eee3 --- /dev/null +++ b/pidl/expr.yp @@ -0,0 +1,202 @@ +# expr.yp +# Copyright (C) 2006 Jelmer Vernooij +# Published under the GNU GPL +# +%left '->' +%right '!' '~' +%left '*' '/' '%' +%left '+' '-' +%left '<<' '>>' +%left '>' '<' +%left '==' '!=' +%left '&' +%left '|' +%left '&&' +%left '||' +%left '?' ':' +%left NEG DEREF ADDROF INV +%left '.' + +%% +exp: + NUM + | + TEXT { "\"$_[1]\"" } + | + func + | + var + | + '~' exp %prec INV { "~$_[2]" } + | + exp '+' exp { "$_[1] + $_[3]" } + | + exp '-' exp { "$_[1] - $_[3]" } + | + exp '*' exp { "$_[1] * $_[3]" } + | + exp '%' exp { "$_[1] % $_[3]" } + | + exp '<' exp { "$_[1] < $_[3]" } + | + exp '>' exp { "$_[1] > $_[3]" } + | + exp '|' exp { "$_[1] | $_[3]" } + | + exp '==' exp { "$_[1] == $_[3]" } + | + exp '<=' exp { "$_[1] <= $_[3]" } + | + exp '=>' exp { "$_[1] => $_[3]" } + | + exp '<<' exp { "$_[1] << $_[3]" } + | + exp '>>' exp { "$_[1] >> $_[3]" } + | + exp '!=' exp { "$_[1] != $_[3]" } + | + exp '||' exp { "$_[1] || $_[3]" } + | + exp '&&' exp { "$_[1] && $_[3]" } + | + exp '&' exp { "$_[1] & $_[3]" } + | + exp '?' exp ':' exp { "$_[1]?$_[3]:$_[5]" } + | + '~' exp { "~$_[1]" } + | + '!' exp { "not $_[1]" } + | + exp '/' exp { "$_[1] / $_[3]" } + | + '-' exp %prec NEG { "-$_[2]" } + | + '&' exp %prec ADDROF { "&$_[2]" } + | + exp '^' exp { "$_[1]^$_[3]" } + | + '(' exp ')' { "($_[2])" } +; + +possible_pointer: + VAR { $_[0]->_Lookup($_[1]) } + | + '*' possible_pointer %prec DEREF { $_[0]->_Dereference($_[2]); "*$_[2]" } +; + +var: + possible_pointer { $_[0]->_Use($_[1]) } + | + var '.' VAR { $_[0]->_Use("$_[1].$_[3]") } + | + '(' var ')' { "($_[2])" } + | + var '->' VAR { $_[0]->_Use("*$_[1]"); $_[1]."->".$_[3] } +; + + +func: + VAR '(' opt_args ')' { "$_[1]($_[3])" } +; + +opt_args: + #empty + { "" } + | + args +; + +exp_or_possible_pointer: + exp + | + possible_pointer +; + +args: + exp_or_possible_pointer + | + exp_or_possible_pointer ',' args { "$_[1], $_[3]" } +; + +%% + +package Parse::Pidl::Expr; + +sub _Lexer { + my($parser)=shift; + + $parser->YYData->{INPUT}=~s/^[ \t]//; + + for ($parser->YYData->{INPUT}) { + if (s/^(0x[0-9A-Fa-f]+)//) { + $parser->YYData->{LAST_TOKEN} = $1; + return('NUM',$1); + } + if (s/^([0-9]+(?:\.[0-9]+)?)//) { + $parser->YYData->{LAST_TOKEN} = $1; + return('NUM',$1); + } + if (s/^([A-Za-z_][A-Za-z0-9_]*)//) { + $parser->YYData->{LAST_TOKEN} = $1; + return('VAR',$1); + } + if (s/^\"(.*?)\"//) { + $parser->YYData->{LAST_TOKEN} = $1; + return('TEXT',$1); + } + if (s/^(==|!=|<=|>=|->|\|\||<<|>>|&&)//s) { + $parser->YYData->{LAST_TOKEN} = $1; + return($1,$1); + } + if (s/^(.)//s) { + $parser->YYData->{LAST_TOKEN} = $1; + return($1,$1); + } + } +} + +sub _Use($$) +{ + my ($self, $x) = @_; + if (defined($self->YYData->{USE})) { + return $self->YYData->{USE}->($x); + } + return $x; +} + +sub _Lookup($$) +{ + my ($self, $x) = @_; + return $self->YYData->{LOOKUP}->($x); +} + +sub _Dereference($$) +{ + my ($self, $x) = @_; + if (defined($self->YYData->{DEREFERENCE})) { + $self->YYData->{DEREFERENCE}->($x); + } +} + +sub _Error($) +{ + my ($self) = @_; + if (defined($self->YYData->{LAST_TOKEN})) { + $self->YYData->{ERROR}->("Parse error in `".$self->YYData->{FULL_INPUT}."' near `". $self->YYData->{LAST_TOKEN} . "'"); + } else { + $self->YYData->{ERROR}->("Parse error in `".$self->YYData->{FULL_INPUT}."'"); + } +} + +sub Run { + my($self, $data, $error, $lookup, $deref, $use) = @_; + + $self->YYData->{FULL_INPUT} = $data; + $self->YYData->{INPUT} = $data; + $self->YYData->{LOOKUP} = $lookup; + $self->YYData->{DEREFERENCE} = $deref; + $self->YYData->{ERROR} = $error; + $self->YYData->{USE} = $use; + + return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error); +} -- cgit v1.2.3