# File PostfixWithActions.eyp
%right '='
%left '-' '+'
%left '*' '/'
%left NEG
%token NUM = /([0-9]+(?:\.[0-9]+)?)/
%token VAR = /([A-Za-z][A-Za-z0-9_]*)/
%%
line: %name EXP
$exp { print "$exp\n" }
;
exp: %name OPERAND:NUM
$NUM
{ $NUM }
| %name OPERAND:VAR
$VAR
{ $VAR }
| %name OP:ASSIGN
VAR.left '='exp.right
{
# & stands for 'address of'
"$_[3] &$_[1] ASSIGN";
}
| %name OP:PLUS
exp.left '+'exp.right
{ "$_[1] $_[3] PLUS"; }
| %name OP:MINUS
exp.left '-'exp.right
{ "$_[1] $_[3] MINUS"; }
| %name OP:TIMES
exp.left '*'exp.right
{ "$_[1] $_[3] TIMES"; }
| %name OP:DIV
exp.left '/'exp.right
{ "$_[1] $_[3] DIV"; }
| %name OP:NEG '-' $exp %prec NEG
{ "$exp NEG" }
| '(' $exp ')'
{ $exp }
;
%%