home: hub: minipeg

ref: 74b7881f93ea9d2df51931debba10770b7fa9cbc
dir: /examples/dc.peg/

View raw version
# 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'