Esiste un meccanismo in Antlr per consentire al lexer di abbinare un token solo durante determinate regole?

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

  •  06-07-2019
  •  | 
  •  

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;
;
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top