#%semantic token '*' '='
%right '='
%left '-' '+'
%left '*' '/'
%left NEG
%lexer {
m{\G[ \t]*}gc;
m{\G(\n)+}gc and $self->tokenline($1 =~ tr/\n//);
m{\G([0-9]+(?:\.[0-9]+)?)}gc and return ('NUM', $1);
m{\Gprint}gc and return ('PRINT', 'PRINT');
m{\G([A-Za-z_][A-Za-z0-9_]*)}gc and return ('VAR', $1);
m{\G(.)}gc and return ($1, $1);
}
#%tree
%tree bypass
%%
line:
sts <%name EXPS + ';'>
;
sts:
%name PRINT
PRINT leftvalue
| exp
;
exp:
%name NUM
NUM
| %name VAR
VAR
| %name ASSIGN
leftvalue '=' exp
| %name PLUS
exp '+' exp
| %name MINUS
exp '-' exp
| %name TIMES
exp '*' exp
| %name DIV
exp '/' exp
| %no bypass NEG
#| %name NEG
'-' exp %prec NEG
| '(' exp ')'
;
leftvalue : %name VAR VAR
;
%%