В предыдущих версиях 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
не могут быть достигнуты из контекста анализатора, порождая ошибку.
Подробнее о новой версии, я обнаружил, что это должно быть возможным, определяя вывод в контексте анализатора внутри %{ ... %}
, но он не работает, хотя он используется для многострочных операторов. Я генерирую код из источника на целевой язык, и я буду преувеличивать этот код, применяя правильный отступ, контролируемый областью действия и генерирующий непосредственно из парсера без создания АСТ.
Как глобальные определения в настоящее время работают в Джисоне?
для нескольких выражений Эта глобальная переменная инициализирована для каждого другого E. в этом сценарии, если я хочу сохранить значения, указав строку, которая не работает. Вот моя грамматика, если вы можете предположить, какие изменения мне нужно сделать, чтобы моя переменная '$ x' могла хранить все значение по всем E. https://jsfiddle.net/Lnukko75/1/ –