byaccj/tests/Sanity/smoke/calc.y
2023-12-07 14:48:14 +01:00

55 lines
1.0 KiB
Plaintext

%{
%}
%token NUM
%left '+' '-'
%left '*' '/'
%%
exp : NUM { $$.ival = $1.ival; }
| exp '+' exp { $$.ival = $1.ival + $3.ival; }
| exp '-' exp { $$.ival = $1.ival - $3.ival; }
| exp '*' exp { $$.ival = $1.ival * $3.ival; }
| exp '/' exp { $$.ival = $1.ival / $3.ival; }
| '(' exp ')' { $$.ival = $2.ival; }
;
%%
private String buf;
private void yyerror(String s) {
throw new RuntimeException("Parse error: " + s);
}
private int yylex() {
if (buf.isEmpty()) {
return 0;
}
int ch = buf.charAt(0);
buf = buf.substring(1);
if (ch >= '0' && ch <= '9') {
yylval.ival = ch - '0';
while (!buf.isEmpty() && buf.charAt(0) >= '0' && buf.charAt(0) <= '9') {
yylval.ival = yylval.ival * 10 + buf.charAt(0) - '0';
buf = buf.substring(1);
}
return NUM;
}
return ch;
}
private int parse(String expr) {
buf = expr;
yyparse();
return val_pop().ival;
}
public static void main(String args[])
{
Parser par = new Parser(true);
int res = par.parse(args[0]);
System.out.println("RESULT is: " + res);
}