Existe um mecanismo no Antlr para permitir que o lexer para combinar um sinal apenas durante certas regras?
Pergunta
Eu gostaria de adicionar uma palavra-chave para a minha língua.
Esta palavra-chave só teria de ser compensada durante uma regra analisador gramática particular.
Devido a compatibilidade com versões anteriores eu gostaria de permitir que esta palavra-chave para continuar a ser usado como um nome de variável, ou seja, ele pode ser combinado pela regra lexer que determina se um sinal é adequado para um nome de variável.
O Lexer coincide com a nova regra sempre que é encontrada no arquivo.
é a forma adequada de trabalhar em torno deste para modificar a regra var_declaration de modo que combine tanto uma IDENT ou os novos tokens palavras-chave?
protected
modified_var_declaration:
VAR (IDENT|KEYWORD);
;
As regras relevantes são:
IDENT // matches variable names
options { testLiterals=true; }
: ( '_' | 'a'..'z' | 'A'..'Z' ) ( '_' | 'a'..'z' | 'A'..'Z' | DIGIT )*
;
KEYWORD: // my new keyword
"key"
;
A regra analisador para a criação de uma variável é:
protected
var_declaration:
VAR IDENT;
;
Solução
Muitas línguas têm palavras-chave sensíveis ao contexto. O primeiro passo para lidar com eles é a adição de um novo ident
regra analisador representando um nome de variável. Use essa regra em seu analisador em vez de IDENT
.
ident
: IDENT
| KEYWORD
;
Outras dicas
Confira http://www.antlr.org/wiki/display /ANTLR3/1.+Lexer que deve ajudá-lo. Você vai precisar de activar e desactivar uma bandeira quando "KEYWORD" será permitido, i.
KEYWORD : { keywordcontext }?=> "key";
O truque aqui seria alternando onde você pode esperar uma palavra-chave, o que poderia ser inferior a trivial.