%whites /([ \t]+)/ %token NUM = /([0-9]+(?:\.[0-9]+)?)/ %token VAR = /([A-Za-z][A-Za-z0-9_]*)/ %right '=' %left '-' '+' %left '*' '/' %left NEG %defaultaction { "$_[1] $_[3] $_[2]" } # example of incremental lexer %incremental lexer 'Write an arithmetic expression: ' %% input: {} | input line {} ; line: '\n' {} | exp '\n' { print "$_[1]\n" } | error '\n' {} ; exp: NUM { $_[1] } | VAR { $_[1] } | VAR '=' exp | exp '+' exp | exp '-' exp | exp '*' exp | exp '/' exp | '-' exp %prec NEG { "$_[2] NEG" } | '(' exp ')' { $_[2] } ; %%