%{
#include <ctype.h>
#include <stdio.h>
#define YYSTYPE double
int yylex(void);
void yyerror(const char *s) { fprintf(stderr, "error: %s\n", s); }
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%right UMINUS
%%
lines : lines expr '\n' { printf("%g\n", $2); }
| lines '\n'
| /* empty */
;
expr : expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '-' expr %prec UMINUS { $$ = -$2; }
| '(' expr ')' { $$ = $2; }
;
%%
int yylex(void)
{
int c;
/* skip spaces and tabs */
while ((c = getchar()) == ' ' || c == '\t')
;
if (c == EOF) return 0;
if (c == '.' || isdigit(c)) {
ungetc(c, stdin);
if (scanf("%lf", &yylval) != 1) return 0;
}
return c; /* return character as token (e.g., '+', '\n', etc.) */
}
JXsKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojZGVmaW5lIFlZU1RZUEUgZG91YmxlCmludCB5eWxleCh2b2lkKTsKdm9pZCB5eWVycm9yKGNvbnN0IGNoYXIgKnMpIHsgZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXNcbiIsIHMpOyB9CiV9CgoldG9rZW4gTlVNQkVSCiVsZWZ0ICcrJyAnLScKJWxlZnQgJyonICcvJwolcmlnaHQgVU1JTlVTCgolJQpsaW5lcyA6IGxpbmVzIGV4cHIgJ1xuJyB7IHByaW50ZigiJWdcbiIsICQyKTsgfQogICAgICB8IGxpbmVzICdcbicKICAgICAgfCAvKiBlbXB0eSAqLwogICAgICA7CmV4cHIgOiBleHByICcrJyBleHByIHsgJCQgPSAkMSArICQzOyB9CiAgICAgfCBleHByICctJyBleHByIHsgJCQgPSAkMSAtICQzOyB9CiAgICAgfCBleHByICcqJyBleHByIHsgJCQgPSAkMSAqICQzOyB9CiAgICAgfCBleHByICcvJyBleHByIHsgJCQgPSAkMSAvICQzOyB9CiAgICAgfCAnLScgZXhwciAlcHJlYyBVTUlOVVMgeyAkJCA9IC0kMjsgfQogICAgIHwgJygnIGV4cHIgJyknIHsgJCQgPSAkMjsgfQogICAgIHwgTlVNQkVSCiAgICAgOwolJQoKaW50IHl5bGV4KHZvaWQpCnsKICAgIGludCBjOwogICAgLyogc2tpcCBzcGFjZXMgYW5kIHRhYnMgKi8KICAgIHdoaWxlICgoYyA9IGdldGNoYXIoKSkgPT0gJyAnIHx8IGMgPT0gJ1x0JykKICAgICAgICA7CiAgICBpZiAoYyA9PSBFT0YpIHJldHVybiAwOwogICAgaWYgKGMgPT0gJy4nIHx8IGlzZGlnaXQoYykpIHsKICAgICAgICB1bmdldGMoYywgc3RkaW4pOwogICAgICAgIGlmIChzY2FuZigiJWxmIiwgJnl5bHZhbCkgIT0gMSkgcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuIE5VTUJFUjsKICAgIH0KICAgIHJldHVybiBjOyAvKiByZXR1cm4gY2hhcmFjdGVyIGFzIHRva2VuIChlLmcuLCAnKycsICdcbicsIGV0Yy4pICovCn0K