# file: Generator.eyp # compile with: eyapp -C '' Generator.eyp # then run: ./Generator.pm %strict %token NUM VARDEF VAR %right '=' %left '-' '+' %left '*' '/' %left NEG %right '^' %defaultaction { my $parser = shift; return join '', @_; } %{ use base q{Parse::Eyapp::TokenGen}; use base q{GenSupport}; %} %% stmts: stmt { $_[0]->deltaweight(VAR => +1); # At least one variable is defined now $_[1]; } | stmts ';' { "\n" } stmt ; stmt: VARDEF '=' exp { my $parser = shift; $parser->defined_variable($_[0]); "$_[0]=$_[2]"; } ; exp: NUM | VAR | exp '+' exp | exp '-' exp | exp '*' exp | exp '/' exp | '-' { $_[0]->pushdeltaweight('-' => -1) } exp %prec NEG { $_[0]->popweight(); "-$_[3]" } | exp '^' exp | '(' { $_[0]->pushdeltaweight('(' => -1, ')' => +1, '+' => +1, ); } exp ')' { $_[0]->popweight; "($_[3])" } ; %%