我的完整语法导致了可怕的“没有可行的选择”的化身,但无论如何,也许我用这个修剪版本看到的问题的解决方案可以帮助我理解正在发生的事情。
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
答案 0 :(得分:1)
可能与FigurativeConstant
规则匹配的每个字符串也会匹配IdWord
规则。由于首先列出了IdWord
规则,并且匹配长度与任一规则相同,因此Lexer会发出IdWord
令牌,而不是FigurativeConstant
令牌。
首先列出FigurativeConstant
规则,您将获得您期望的结果。
作为一种风格问题,您列出规则的顺序会掩盖其订单的重要性,特别是对于Lexer和Parser的必要POV。以antlr/grammars-v4存储库中的语法为例 - 通常,对于组合语法,解析器在顶部和自上而下的排序。如果您的语法更容易阅读,我甚至会猜测其他人可能会早点回答。