Esiste un meccanismo in Antlr per consentire al lexer di abbinare un token solo durante determinate regole?
Domanda
Vorrei aggiungere una parola chiave nella mia lingua.
Questa parola chiave dovrebbe essere abbinata solo durante una particolare regola grammaticale del parser.
A causa della compatibilità con le versioni precedenti, vorrei consentire a questa parola chiave di continuare a essere utilizzata come nome di una variabile, ovvero può corrispondere alla regola lexer che determina se un token è adatto a un nome di variabile.
La Lexer corrisponde alla nuova regola ogni volta che viene trovata nel file.
È il modo appropriato di aggirare questo problema per modificare la regola var_declaration in modo che corrisponda a un IDENT o ai nuovi token KEYWORD?
protected
modified_var_declaration:
VAR (IDENT|KEYWORD);
;
Le regole pertinenti sono:
IDENT // matches variable names
options { testLiterals=true; }
: ( '_' | 'a'..'z' | 'A'..'Z' ) ( '_' | 'a'..'z' | 'A'..'Z' | DIGIT )*
;
KEYWORD: // my new keyword
"key"
;
La regola del parser per la creazione di una variabile è:
protected
var_declaration:
VAR IDENT;
;
Soluzione
Molte lingue hanno parole chiave sensibili al contesto. Il primo passo per gestirli è l'aggiunta di una nuova regola parser ident
che rappresenta un nome di variabile. Usa quella regola nel tuo parser invece di IDENT
.
ident
: IDENT
| KEYWORD
;
Altri suggerimenti
Scopri http://www.antlr.org/wiki/display /ANTLR3/1.+Lexer che dovrebbe aiutarti. Dovrai impostare e deselezionare un flag quando " PAROLA CHIAVE " sarà consentito, ad esempio
KEYWORD : { keywordcontext }?=> "key";
il trucco qui sarebbe quello di passare da dove puoi aspettarti una parola chiave, che potrebbe essere meno che banale.