#%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 ; %%