我試圖用一些簡單的函數來擴展Jison calculator example。我是相當新的解析和野牛/ jison,但這一點是我到目前爲止有:將函數添加到野牛/ 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
甚至沒有定義。爲什麼不在發送給函數之前解析整個表達式列表?
謝謝你解釋它是如何工作! – whereswalden 2014-10-30 20:19:12