%{ =head1 SYNOPSIS Compile it with eyapp -m 'Calc' Rule9.yp treereg -o T.pm -p 'R::' -m T Transform4 to execute, run C =cut %} %semantic token '=' '-' '+' '*' '/' %right '=' %left '-' '+' %left '*' '/' %left NEG %tree %% line: exp { $_[1] } ; exp: %name NUM NUM | %name VAR VAR | %name ASSIGN VAR '=' exp | %name PLUS exp '+' exp | %name MINUS exp '-' exp | %name TIMES exp '*' exp | %name DIV exp '/' exp | %name UMINUS '-' exp %prec NEG | '(' exp ')' { $_[2] } /* Let us simplify a bit the tree */ ; %% __PACKAGE__->lexer( sub { my($parser)=shift; for (${$parser->input}) { s/^\s+(?:#.*)?//; s/^([0-9]+(?:\.[0-9]+)?)// and return('NUM',$1); s/^([A-Za-z][A-Za-z0-9_]*)// and return('VAR',$1); s/^(.)// and return($1,$1); return ('',undef); } } );