Existe-t-il un mécanisme dans Antlr permettant au lexer de ne faire correspondre un jeton que pendant certaines règles?

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

  •  06-07-2019
  •  | 
  •  

Question

J'aimerais ajouter un mot clé à ma langue.

Ce mot clé ne doit être mis en correspondance que pendant une règle de grammaire de l'analyseur en particulier.

En raison de la compatibilité ascendante, j'aimerais que ce mot-clé continue à être utilisé en tant que nom de variable, c'est-à-dire qu'il peut être associé à la règle lexer qui détermine si un jeton convient à un nom de variable.

Le Lexer correspond à la nouvelle règle à chaque fois qu'elle se trouve dans le fichier.

La manière appropriée de contourner ce problème est-elle de modifier la règle var_declaration afin qu'elle corresponde à un IDENT ou aux nouveaux jetons KEYWORD?

protected
modified_var_declaration:
     VAR (IDENT|KEYWORD);
;

Les règles pertinentes sont les suivantes:

IDENT   // matches variable names
options { testLiterals=true; }
    : ( '_' | 'a'..'z' | 'A'..'Z' ) ( '_' | 'a'..'z' | 'A'..'Z' | DIGIT )*
;

KEYWORD: // my new keyword
  "key"
;

La règle d'analyse pour la création d'une variable est:

protected
var_declaration:
     VAR IDENT;
;
Était-ce utile?

La solution

De nombreuses langues ont des mots clés contextuels. La première étape de leur gestion consiste à ajouter une nouvelle règle d’analyseur ident représentant un nom de variable. Utilisez cette règle dans votre analyseur au lieu de IDENT .

ident
    : IDENT
    | KEYWORD
    ;

Autres conseils

Découvrez http://www.antlr.org/wiki/display /ANTLR3/1.+Lexer qui devrait vous aider. Vous devrez définir et désélectionner un indicateur lorsque " KEYWORD " sera autorisé, c'est-à-dire.

KEYWORD : { keywordcontext }?=> "key";

le truc ici serait de basculer là où vous pouvez vous attendre à un mot clé, ce qui pourrait être moins que trivial.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top