text: # 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' / ';'
  