61 lines
No EOL
1.2 KiB
Text
61 lines
No EOL
1.2 KiB
Text
/* description: Parses end executes mathematical expressions. */
|
|
|
|
/* lexical grammar */
|
|
%lex
|
|
|
|
%%
|
|
\s+ /* skip whitespace */
|
|
[0-9]+("."[0-9]+)?\b return 'NUMBER';
|
|
"*" return '*';
|
|
"/" return '/';
|
|
"-" return '-';
|
|
"+" return '+';
|
|
"^" return '^';
|
|
"(" return '(';
|
|
")" return ')';
|
|
"PI" return 'PI';
|
|
"E" return 'E';
|
|
<<EOF>> return 'EOF';
|
|
|
|
/lex
|
|
|
|
/* operator associations and precedence */
|
|
|
|
%left '+' '-'
|
|
%left '*' '/'
|
|
%left '^'
|
|
%left UMINUS
|
|
|
|
%start expressions
|
|
|
|
%% /* language grammar */
|
|
|
|
expressions
|
|
: e EOF
|
|
{print($1); return $1;}
|
|
;
|
|
|
|
e
|
|
: e '+' e
|
|
{$$ = $1+$3;}
|
|
| e '-' e
|
|
{$$ = $1-$3;}
|
|
| e '*' e
|
|
{$$ = $1*$3;}
|
|
| e '/' e
|
|
{$$ = $1/$3;}
|
|
| e '^' e
|
|
{$$ = Math.pow($1, $3);}
|
|
| '-' e %prec UMINUS
|
|
{$$ = -$2;}
|
|
| '(' e ')'
|
|
{$$ = $2;}
|
|
| NUMBER
|
|
{$$ = Number(yytext);}
|
|
| E
|
|
{$$ = Math.E;}
|
|
| PI
|
|
{$$ = Math.PI;}
|
|
;
|
|
|
|
/* From https://gerhobbelt.github.io/jison/docs/#specifying-a-language */ |