Existe-t-il un mécanisme dans Antlr permettant au lexer de ne faire correspondre un jeton que pendant certaines règles?
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;
;
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.