2015-10-14 5 views
2

Есть ли способ передать данные в Jison таким образом, чтобы он мог ссылаться на него во время разбора? В качестве исходного случая, скажем, мы используем calculator.jison и хотим, чтобы передать ему объект, скажетПередача данных в парсер Jison

var parser = new jison.Parser(bnf); 
var data = `{m: 4, b: 2, x: 10}; 
parser.parse("m*x + b", data); 

Вот calculator.jison с новым делом 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;} 
    ; 
+0

Doh, теперь, когда я написал этот вопрос я могу, наконец, понять документы. Ответ здесь https://zaach.github.io/jison/docs/#sharing-scope – prototype

ответ

2

VARIABLE = { $$ = yy.data[text]; }

var parser = new jison.Parser(bnf); 
parser.yy = {data: {m: 4, b: 2, x: 10}}; 
parser.parse("m*x + b"); 

 Смежные вопросы

  • Нет связанных вопросов^_^