In früheren Versionen von Jison war es möglich, eine Flex-ähnliche Funktion zu haben, die Variablen zugänglich in beiden den Lexer und Parser Kontexte erlaubt definieren, wie zum Beispiel:Jison globale Variablen
%{
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?
Obwohl dies in der neuesten Version von Jison nicht gültig ist. chars
, words
und lines
können aus dem Parserkontext nicht erreicht werden und erzeugen einen Fehler.
Suche mehr über die neue Version, ich fand, dass es möglich sein sollte, indem Ausgabe im Parser-Kontext innerhalb von %{ ... %}
definiert, aber es funktioniert nicht, obwohl es für mehrzeilige Anweisungen verwendet wird. Ich erzeuge Code von einer Quelle zu einer Zielsprache, und ich werde diesen Code verschönern, indem ich die korrekte Einrückung anwende, die vom Scope gesteuert wird und direkt aus dem Parser generiert, ohne einen AST zu erstellen.
Wie funktionieren globale Definitionen derzeit in Jison?
für mehrere Ausdrücke Diese globale Variable wird für jedes andere E anders initialisiert. In diesem Szenario, wenn ich Werte speichern möchte, indem ich eine Zeichenfolge zusammenfasse, funktioniert sie nicht. Hier ist meine Grammatik, wenn Sie vorschlagen können, welche Änderungen ich machen muss, damit meine Variable '$ x' den ganzen Wert über alle E. speichern kann. Https://jsfiddle.net/Lnukko75/1/ –