%{
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int yylex();
void yyerror(const char *s);
int yylval;
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%right UMINUS
%%
stmt_list: stmt_list expr '\n' { printf("Result: %d\n", $2); }
| expr '\n' { printf("Result: %d\n", $1); }
;
expr: expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr {
if ($3 == 0) {
yyerror("Division by zero!");
$$ = 0;
} else {
$$ = $1 / $3;
}
}
| '-' expr %prec UMINUS { $$ = -$2; }
| '(' expr ')' { $$ = $2; }
;
%%
int yylex() {
int c;
while ((c = getchar()) == ' ' || c == '\t');
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%d", &yylval);
}
if (c == '\n' || c == EOF) return c;
return c;
}
void yyerror(const char *s) {
fprintf(stderr, "Error: %s\n", s);
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CmludCB5eWxleCgpOwp2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciAqcyk7CmludCB5eWx2YWw7CiV9CiV0b2tlbiBOVU1CRVIKJWxlZnQgJysnICctJwolbGVmdCAnKicgJy8nCiVyaWdodCBVTUlOVVMKJSUKCnN0bXRfbGlzdDogc3RtdF9saXN0IGV4cHIgJ1xuJyB7IHByaW50ZigiUmVzdWx0OiAlZFxuIiwgJDIpOyB9CiAgICAgICAgIHwgZXhwciAnXG4nIHsgcHJpbnRmKCJSZXN1bHQ6ICVkXG4iLCAkMSk7IH0KICAgICAgICAgOwoKZXhwcjogZXhwciAnKycgZXhwciB7ICQkID0gJDEgKyAkMzsgfQogICAgfCBleHByICctJyBleHByIHsgJCQgPSAkMSAtICQzOyB9CiAgICB8IGV4cHIgJyonIGV4cHIgeyAkJCA9ICQxICogJDM7IH0KICAgIHwgZXhwciAnLycgZXhwciB7CiAgICAgICAgaWYgKCQzID09IDApIHsKICAgICAgICAgICAgeXllcnJvcigiRGl2aXNpb24gYnkgemVybyEiKTsKICAgICAgICAgICAgJCQgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQkID0gJDEgLyAkMzsKICAgICAgICB9CiAgICB9CiAgICB8ICctJyBleHByICVwcmVjIFVNSU5VUyB7ICQkID0gLSQyOyB9CiAgICB8ICcoJyBleHByICcpJyB7ICQkID0gJDI7IH0KICAgIHwgTlVNQkVSIHsgJCQgPSAkMTsgfQogICAgOwoKJSUKCmludCB5eWxleCgpIHsKICAgIGludCBjOwoKICAgIHdoaWxlICgoYyA9IGdldGNoYXIoKSkgPT0gJyAnIHx8IGMgPT0gJ1x0Jyk7CiAgICBpZiAoaXNkaWdpdChjKSkgewogICAgICAgIHVuZ2V0YyhjLCBzdGRpbik7CiAgICAgICAgc2NhbmYoIiVkIiwgJnl5bHZhbCk7CiAgICAgICAgcmV0dXJuIE5VTUJFUjsKICAgIH0KICAgIGlmIChjID09ICdcbicgfHwgYyA9PSBFT0YpIHJldHVybiBjOwogICAgcmV0dXJuIGM7Cn0KCnZvaWQgeXllcnJvcihjb25zdCBjaGFyICpzKSB7CiAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiAlc1xuIiwgcyk7Cn0KCg==