我正在尝试使用一些简单的功能来扩展Jison 计算器示例。我对解析和野牛/吉森相当陌生,但这是我到目前为止所拥有的一点:
/* lexical grammar */
%lex
%{
var funcs = {
pow: function(a, b) { return Math.pow(a, b); },
test: function(a) { return a*2; }
}
%}
%%
\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
{ return $1; }
;
expression_list
: expression_list ',' e
| e
;
e
: e '*' e
{$$ = $1*$3;}
| '(' e ')'
{$$ = $2;}
| NUMBER
{$$ = Number(yytext);}
| NAME '(' expression_list ')'
{$$ = funcs[$NAME]($expression_list);}
;
问题是函数只得到一个参数传递给它们。例如:
test(2) -> 4
pow(2,3) -> null
事实上,如果你console.log
的论点pow
,它似乎b
甚至没有定义。为什么它在将整个表达式列表发送到函数之前不解析整个表达式列表?