The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Grammar

Expr	= SPACE Sum EOL		{ printf("%d\n", pop()); }
	 | (!EOL .)* EOL		{ printf("error\n"); }

Sum	= Product ( PLUS  Product	{ int r= pop(), l= pop();  push(l + r); }
		   | MINUS Product	{ int r= pop(), l= pop();  push(l - r); }
		   )*

Product	= Value ( TIMES  Value		{ int r= pop(), l= pop();  push(l * r); }
                 | DIVIDE Value		{ int r= pop(), l= pop();  push(l / r); }
		 )*

Value	= NUMBER			{ push(atoi(yytext)); }
	 | OPEN Sum CLOSE

# Lexemes

NUMBER	= < [0-9]+ > SPACE
PLUS	= '+' SPACE
MINUS	= '-' SPACE
TIMES	= '*' SPACE
DIVIDE	= '/' SPACE
OPEN	= '(' SPACE
CLOSE	= ')' SPACE
SPACE	= [ \t]*
EOL	= '\n' | '\r\n' | '\r'