2015-05-31 17 views
8

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?

Antwort

4

Die aktuelle Version von Jison hat eine variable named yy, deren Zweck es ist, die gemeinsame Nutzung von Daten zwischen lexikalischen Aktionen, semantischen Aktionen und anderen Modulen zu ermöglichen. Ihr Codebeispiel kann funktionieren, wenn Sie speichern alle diese Variablen in yy wie folgt:

%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); }; 

Der obige Code wurde 0.4.13 auf Jison's try page mit Jison getestet.

+0

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/ –