home: hub: minipeg

ref: c14d7f600d8c1d7c32221cf212f2f78acf970a5b
dir: /examples/dcv.peg/

View raw version

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


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' | ';'