Antlr4 代币识别令

Antlr4 代币识别令,antlr4,Antlr4,我完整的语法结果是可怕的“没有可行的选择”的化身,但无论如何,也许我看到的这个精简版本的问题的解决方案可以帮助我理解发生了什么 grammar NOVIA; WS : [ \t\r\n]+ -> skip ; // whitespace rule -> toss it out T_INITIALIZE : 'INITIALIZE' ; T_REPLACING : 'REPLACING' ; T_ALPHABETIC : 'ALPHABETIC' ; T_ALPHANUMERI

我完整的语法结果是可怕的“没有可行的选择”的化身,但无论如何,也许我看到的这个精简版本的问题的解决方案可以帮助我理解发生了什么

grammar NOVIA;

WS : [ \t\r\n]+ -> skip ;  // whitespace rule -> toss it out

T_INITIALIZE : 'INITIALIZE' ;
T_REPLACING  : 'REPLACING' ;
T_ALPHABETIC : 'ALPHABETIC' ;
T_ALPHANUMERIC : 'ALPHANUMERIC' ;
T_BY         : 'BY' ;

IdWord : IdLetter IdSeparatorAndLetter* ;

IdLetter : [a-zA-Z0-9];
IdSeparatorAndLetter : ([\-]* [_]* [A-Za-z0-9]+);



FigurativeConstant :
      'ZEROES' | 'ZERO' | 'SPACES' | 'SPACE' 
;

statement :  initStatement ;

initStatement : T_INITIALIZE identifier+ T_REPLACING (T_ALPHABETIC | T_ALPHANUMERIC) T_BY (literal | identifier) ;

literal : FigurativeConstant ;

identifier : IdWord ;
和以下输入

INITIALIZE ABC REPLACING ALPHANUMERIC BY SPACES
导致

(statement (initStatement INITIALIZE (identifier ABC) REPLACING ALPHANUMERIC BY (identifier SPACES)))
我希望看到空格被识别为“文字”,而不是“标识符”

非常感谢所有的指示者


TIA-Alex

可能与
figulativeconstant
规则匹配的每个字符串也将与
IdWord
规则匹配。因为
IdWord
规则首先列出,并且匹配长度与任一规则相同,所以Lexer发出
IdWord
标记,而不是
figulativeconstant
标记

首先列出
figulativeconstant
规则,您将得到预期的结果


就风格而言,列出规则的顺序掩盖了规则顺序的重要性,特别是对于Lexer和Parser的必要POV。以存储库中的语法为例——通常情况下,对于组合语法、自上而下的语法分析器和自上而下的顺序。我甚至会冒险猜测,如果你的语法更容易阅读,其他人可能会更快地回答

谢谢-我现在觉得自己很愚蠢吗?大胆猜测,你就不会错了。。在我疯狂地试图用精简的语法重现小说《Lealt》一文时,我只是没有对它的风格给予足够的关注,对此我深表歉意。我只交换了“文字”和“标识符”规则,但没有交换lexer规则。我会尽量把这归因于我的油炸大脑,因为我们昨天的温度是35℃,希望我能侥幸逃脱;-)所以回到绘图板上来,因为这并没有(也不能)用完整的语法解决我的小说学习问题。