Adding Functions To Bison/jison Calculator Language
Solution 1:
The following code does what you asked for. Salient points:
The rules for
expression_list
now build an actual list of values to be used with the functions being called.The list built by
expression_list
are passed toapply
so that they become the arguments of the function being called (undefined
is there as the first argument to set the value ofthis
toundefined
).I've added a
console.log
instruction to the actions forexpression
so that I'd see what is going on when I run the resulting parser at the command line.I've moved the definition of
funcs
to the very start. Where it was jison was just not putting it in the right place in the final file.
Here's the final file:
%{var funcs = {
pow: function(a, b) { return Math.pow(a, b); },
test: function(a) { return a*2; }
}
%}
/* lexical grammar */
%lex
%%
\s+ /* skip whitespace */
[0-9]+("."[0-9]+)?\b return'NUMBER'
[a-zA-Z]+ return'NAME'","return','"*"return'*'"("return'('")"return')'
<<EOF>> return'EOF'
. return'INVALID'
/lex
%start expressions
%% /* language grammar */
expressions
: e EOF
{ console.log($1); return $1; }
;
expression_list
: expression_list ',' e
{ $$ = $1.concat([$3]); }
| e
{ $$ = [$1]; }
;
e
: e '*' e
{$$ = $1*$3;}
| '(' e ')'
{$$ = $2;}
| NUMBER
{$$ = Number(yytext);}
| NAME '(' expression_list ')'
{$$ = funcs[$NAME].apply(undefined, $expression_list);}
;
Solution 2:
You need an action in the first production for expression_list
. The default action just copies $1
to $$
, which means that the appended value is discarded.
Post a Comment for "Adding Functions To Bison/jison Calculator Language"