diff --git a/calc.leg b/calc.leg index 1ca88c8..dd37277 100644 --- a/calc.leg +++ b/calc.leg @@ -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)