61 lines
1.2 KiB
Text
61 lines
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 */
|