Tout d'abord, vous avez plusieurs erreurs dans la grammaire que vous avez publié:
L'en-tête du fichier doit spécifier la grammaire , pas Grammer. Vos jetons Lexer PluginName et PluginDesc n'ont pas deux points devant eux et un point-virgule pour les terminer. C'est aussi une règle (non écrite?) D'écrire vos règles d'analyseur comme toutes les minuscules et vos règles lexer comme majuscules.
grammar PluginDoc;
pluginDef : pluginName | pluginDesc;
pluginName : PLUGIN_NAME IDENTIFIER;
pluginDesc : PLUGIN_DESC TEXT;
PLUGIN_NAME : '@pluginName';
PLUGIN_DESC : '@pluginDesc';
IDENTIFIER : [a-zA-Z_]+;
TEXT : ~(' ' | '\n' | '\t')+;
Certains des problèmes que j'ai rencontrés lors du test de votre grammaire étaient dus aux espaces non gérés. Tout d'abord, vous devez inclure une règle Lexer pour ignorer les espaces à la fin du fichier après toutes les autres règles Lexer.
WS: [ \n\t\r]+ -> skip;
Ensuite, il y a un problème avec votre TEXT
et IDENTIFIER
se heurtant les uns avec les autres. Lorsque le flux de caractères est segmenté par le Lexer, kafka
et abc
peuvent être à la fois le jeton IDENTIFIER
et le jeton TEXT
. Depuis les lexes de Lexer de façon top-down, ils sont tous les deux tokenized comme la règle de Lexer vient en premier dans votre grammaire. Cela provoque l'erreur que vous rencontrez - tout ce que vous définissez comme la deuxième règle ne peut pas correspondre dans l'analyseur, car il n'a pas été envoyé en tant que jeton.
Comme suggéré par Lucas, vous devriez probablement faire correspondre les deux comme TEXT
et vérifier ensuite la validité de l'entrée dans votre Listener/Visitor.
grammar PluginDoc;
pluginDef : (pluginName | pluginDesc)* EOF;
pluginName : PLUGIN_NAME TEXT;
pluginDesc : PLUGIN_DESC TEXT;
PLUGIN_NAME: '@pluginName';
PLUGIN_DESC: '@pluginDesc';
TEXT : ~[ \r\n\t]+;
WS: [ \r\n\t]+ -> skip;
J'ai aussi changé la règle pluginDef
Parser à
pluginDef : (pluginName | pluginDesc)* EOF;
car il était mon impression que vous voulez saisir à la fois @pluginName X
et @pluginDesc Y
à la fois et de les identifier. Si ce n'est pas le cas, n'hésitez pas à revenir à ce que vous aviez auparavant.
L'AST résultant produit par la grammaire modifiée ci-dessus onyour entrée échantillon:
Vous pouvez également exécuter ce avec un fichier texte en entrée.
Il suffit d'utiliser 'TEXT' pour les deux, puis de valider le nom de l'identifiant dans une phase de post-traitement. –