2015-05-31 5 views
8

В предыдущих версиях Jison, это было возможно иметь Flex-подобную функцию, что позволило определить переменные, доступные в обоих лексический и синтаксический анализатор контекстов, таких как:Jison глобальные переменные

%{ 
var chars = 0; 
var words = 0; 
var lines = 0; 
%} 

%lex 
%options flex 

%% 
\s 
[^ \t\n\r\f\v]+ { words++; chars+= yytext.length; } 
. { chars++; } 
\n { chars++; lines++ } 
/lex 

%% 
E : { console.log(lines + "\t" + words + "\t" + chars) ; }; 

Ref .:Flex like features?

Хотя в последней версии Jison это недопустимо. chars, words и lines не могут быть достигнуты из контекста анализатора, порождая ошибку.

Подробнее о новой версии, я обнаружил, что это должно быть возможным, определяя вывод в контексте анализатора внутри %{ ... %}, но он не работает, хотя он используется для многострочных операторов. Я генерирую код из источника на целевой язык, и я буду преувеличивать этот код, применяя правильный отступ, контролируемый областью действия и генерирующий непосредственно из парсера без создания АСТ.

Как глобальные определения в настоящее время работают в Джисоне?

ответ

4

В текущей версии Jison имеется variable named yy, целью которой является совместное использование данных между лексическими действиями, семантическими действиями и другими модулями. Ваш пример кода может работать, если вы храните все эти переменные в yy следующим образом:

%lex 
%options flex 

%{ 
if (!('chars' in yy)) { 
    yy.chars = 0; 
    yy.words = 0; 
    yy.lines = 1; 
} 
%} 

%% 
[^ \t\n\r\f\v]+ { yy.words++; yy.chars += yytext.length; } 
. { yy.chars++; } 
\n { yy.chars++; yy.lines++ } 
/lex 

%% 
E : { console.log(yy.lines + "\t" + yy.words + "\t" + yy.chars); }; 

Приведенный выше код был проверен с помощью Jison 0.4.13 на Jison's try page.

+0

для нескольких выражений Эта глобальная переменная инициализирована для каждого другого E. в этом сценарии, если я хочу сохранить значения, указав строку, которая не работает. Вот моя грамматика, если вы можете предположить, какие изменения мне нужно сделать, чтобы моя переменная '$ x' могла хранить все значение по всем E. https://jsfiddle.net/Lnukko75/1/ –