是否有一种方法可以将数据传递给Jison,以便它可以在解析期间引用它?首先,假设我们使用的是calculator.jison
并想给它传递一个对象,比如
var parser = new jison.Parser(bnf);
var data = `{m: 4, b: 2, x: 10};
parser.parse("m*x + b", data);
这是计算器。jison添加了一个新的case VARIABLE { $$ = data[text]; }
,它使用提供的数据对象解析变量:
%start expressions
%% /* language grammar */
expressions : e EOF { 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 '!'
{{
$$ = (function fact (n) { return n==0 ? 1 : fact(n-1) * n })($1);
}}
| e '%'
{$$ = $1/100;}
| '-' e %prec UMINUS
{$$ = -$2;}
| '(' e ')'
{$$ = $2;}
| VARIABLE
{ $$ = data[text]; }
| NUMBER
{$$ = Number(yytext);}
| E
{$$ = Math.E;}
| PI
{$$ = Math.PI;}
;
VARIABLE = { $$ = yy.data[text]; }
var parser = new jison.Parser(bnf);
parser.yy = {data: {m: 4, b: 2, x: 10}};
parser.parse("m*x + b");