2015-05-31 13 views
8

Nelle precedenti versioni di Jison, era possibile avere una funzione Flex-like che ha permesso di definire le variabili accessibili in entrambi i contesti lexer e parser, come ad esempio:Jison variabili globali

%{ 
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?

Sebbene, nell'ultima versione di Jison, questo non sia valido. chars, words e lines non possono essere raggiunti dal contesto del parser, generando un errore.

Cercando di più sulla nuova versione, ho scoperto che dovrebbe essere possibile definendo l'output, nel contesto del parser, all'interno di %{ ... %}, ma non funziona, sebbene sia utilizzato per le istruzioni su più righe. Sto generando codice da un'origine a una lingua di destinazione e proverò questo codice, applicando il rientro corretto, controllato dall'ambito e generando direttamente dal parser, senza creare un AST.

Come funzionano attualmente le definizioni globali in Jison?

risposta

4

L'attuale versione di Jison ha uno variable named yy il cui scopo è consentire la condivisione di dati tra azioni lessicali, azioni semantiche e altri moduli. Il tuo esempio di codice può funzionare se si memorizzano tutte le variabili in yy come segue:

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

Il codice di cui sopra è stata testata utilizzando Jison 0.4.13 su Jison's try page.

+0

per più espressioni Questa variabile globale viene inizializzata in modo diverso per ogni altro E. in quello scenario se si desidera memorizzare i valori concettando una stringa che non funziona. Ecco la mia grammatica se puoi suggerire quali modifiche devo apportare in modo che la mia variabile '$ x' possa memorizzare tutto il valore su tutti E. https://jsfiddle.net/Lnukko75/1/ –