# Grammar

Stmt	<- SPACE Expr EOL			{ printf("%d\n", pop()); }
	 / (!EOL .)* EOL			{ printf("error\n"); }

Expr	<- ID { var= yytext[0] } ASSIGN Sum	{ vars[var - 'a']= top(); }
	 / Sum

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)); }
	 / < ID > !ASSIGN			{ push(vars[yytext[0] - 'a']); }
	 / OPEN Expr CLOSE

# Lexemes

NUMBER	<- < [0-9]+ >	SPACE
ID	<- < [a-z]  >	SPACE
ASSIGN	<- '='		SPACE
PLUS	<- '+'		SPACE
MINUS	<- '-'		SPACE
TIMES	<- '*'		SPACE
DIVIDE	<- '/'		SPACE
OPEN	<- '('		SPACE
CLOSE	<- ')'		SPACE

SPACE	<- [ \t]*
EOL	<- '\n' / '\r\n' / '\r' / ';'
