令牌识别顺序

时间:2014-06-10 20:59:04

标签: antlr4

我的完整语法导致了可怕的“没有可行的选择”的化身,但无论如何,也许我用这个修剪版本看到的问题的解决方案可以帮助我理解正在发生的事情。

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)))

我原本希望看到SPACES被识别为“文字”,而不是“标识符”。

任何和所有指针都非常赞赏,

TIA - Alex

1 个答案:

答案 0 :(得分:1)

可能与FigurativeConstant规则匹配的每个字符串也会匹配IdWord规则。由于首先列出了IdWord规则,并且匹配长度与任一规则相同,因此Lexer会发出IdWord令牌,而不是FigurativeConstant令牌。

首先列出FigurativeConstant规则,您将获得您期望的结果。

作为一种风格问题,您列出规则的顺序会掩盖其订单的重要性,特别是对于Lexer和Parser的必要POV。以antlr/grammars-v4存储库中的语法为例 - 通常,对于组合语法,解析器在顶部和自上而下的排序。如果您的语法更容易阅读,我甚至会猜测其他人可能会早点回答。