Existe um mecanismo no Antlr para permitir que o lexer para combinar um sinal apenas durante certas regras?

StackOverflow https://stackoverflow.com/questions/1620011

  •  06-07-2019
  •  | 
  •  

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;
;
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top