いくつかの単純な関数を使用して、 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);}
;
問題は、関数が 1 つの引数しか渡されないことです。例えば:
test(2) -> 4
pow(2,3) -> null
実際、console.log
の引数を指定すると、定義すらされていないpow
ように見えます。b
関数に送信する前に式リスト全体を解析しないのはなぜですか?