Ho una semplice grammatica:regole ANTLR AST fallire con RewriteEmptyStreamException
grammar sample;
options { output = AST; }
assignment
: IDENT ':=' expr ';'
;
expr
: factor ('*' factor)*
;
factor
: primary ('+' primary)*
;
primary
: NUM
| '(' expr ')'
;
IDENT : ('a'..'z')+ ;
NUM : ('0'..'9')+ ;
WS : (' '|'\n'|'\t'|'\r')+ {$channel=HIDDEN;} ;
Ora voglio aggiungere alcune regole di riscrittura per generare un AST. Da quello che ho letto on-line e nel libro modelli di linguaggio, dovrei essere in grado di modificare la grammatica in questo modo:
assignment
: IDENT ':=' expr ';' -> ^(':=' IDENT expr)
;
expr
: factor ('*' factor)* -> ^('*' factor+)
;
factor
: primary ('+' primary)* -> ^('+' primary+)
;
primary
: NUM
| '(' expr ')' -> ^(expr)
;
Ma non funziona. Sebbene compili bene, quando eseguo il parser ottengo un errore RewriteEmptyStreamException. Ecco dove le cose si fanno strane.
Se definisco i token Pseudo ADD e MULT e li utilizzo al posto dei letterali del nodo dell'albero, funziona senza errori.
tokens { ADD; MULT; }
expr
: factor ('*' factor)* -> ^(MULT factor+)
;
factor
: primary ('+' primary)* -> ^(ADD primary+)
;
In alternativa, se uso la notazione suffisso nodo, sembra anche funzionare bene:
expr
: factor ('*'^ factor)*
;
factor
: primary ('+'^ primary)*
;
È questa discrepanza nel comportamento un bug?
Grazie mille @JoelPM. Questo e 'esattamente quello che stavo cercando. Durante la valutazione, abbiamo riscontrato un problema con la struttura ad albero nidificato e gli overflow dello stack.Questo ci dà la possibilità di generare un albero N-ary e riduce drasticamente la profondità dell'albero –