|
|
@ -1,7 +1,7 @@ |
|
|
|
%{ |
|
|
|
|
|
|
|
/* compile: leg -o calc.c calc.leg |
|
|
|
* cc -o calc calc.c |
|
|
|
/* compile: leg -o calc.c calc.leg |
|
|
|
* cc -o calc calc.c |
|
|
|
* |
|
|
|
* run: echo "2+3" | ./calc |
|
|
|
*/ |
|
|
@ -11,31 +11,31 @@ YYSTYPE yylval = 0; |
|
|
|
|
|
|
|
%} |
|
|
|
|
|
|
|
start = e:exp { yylval = e } |
|
|
|
start = e:exp { yylval = e } |
|
|
|
|
|
|
|
exp = - s:sum { $$ = s } |
|
|
|
exp = - s:sum { $$ = s } |
|
|
|
|
|
|
|
sum = PLUS* l:prod |
|
|
|
( PLUS+ r:prod { l += r } |
|
|
|
| MINUS r:prod { l -= r } |
|
|
|
)* { $$ = l } |
|
|
|
sum = PLUS* l:prod |
|
|
|
( PLUS+ r:prod { l += r } |
|
|
|
| MINUS r:prod { l -= r } |
|
|
|
)* { $$ = l } |
|
|
|
|
|
|
|
prod = l:neg |
|
|
|
( MULTI r:neg { l *= r } |
|
|
|
| DIVIDE r:neg { l /= r } |
|
|
|
| MODULO r:neg { l %= r } |
|
|
|
)* { $$ = l } |
|
|
|
|
|
|
|
neg = MINUS n:neg { $$ = -n } |
|
|
|
| n:NUMBER { $$ = n } |
|
|
|
|
|
|
|
- = [ \t]* |
|
|
|
NUMBER = < [0-9]+ > - { $$ = atoi(yytext) } |
|
|
|
PLUS = '+' - |
|
|
|
MINUS = '-' - |
|
|
|
MULTI = '*' - |
|
|
|
DIVIDE = '/' - |
|
|
|
MODULO = '%' - |
|
|
|
( MULTI r:neg { l *= r } |
|
|
|
| DIVIDE r:neg { l /= r } |
|
|
|
| MODULO r:neg { l %= r } |
|
|
|
)* { $$ = l } |
|
|
|
|
|
|
|
neg = MINUS n:neg { $$ = -n } |
|
|
|
| n:NUMBER { $$ = n } |
|
|
|
|
|
|
|
- = [ \t]* |
|
|
|
NUMBER = < [0-9]+ > - { $$ = atoi(yytext) } |
|
|
|
PLUS = '+' - |
|
|
|
MINUS = '-' - |
|
|
|
MULTI = '*' - |
|
|
|
DIVIDE = '/' - |
|
|
|
MODULO = '%' - |
|
|
|
%% |
|
|
|
|
|
|
|
int main(int argc, char **argv) |
|
|
|