#%semantic token '*' '=' %right '=' %left '-' '+' %left '*' '/' %left NEG #%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 ; %% my $lineno = 1; sub Err { my $parser = shift; my($token)=$parser->YYCurval; my($what)= $token ? "input: '$token'" : "end of input"; my @expected = $parser->YYExpect(); local $" = ', '; die << "ERRMSG"; Syntax error near $what (line number $lineno). Expected one of these terminals: @expected ERRMSG } sub Lex { my($parser)=shift; # The parser object for ($parser->YYData->{INPUT}) { # Topicalize m{\G[ \t]*}gc; m{\G\n}gc and $lineno++; 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); return('',undef); } }