我的完整语法导致了可怕的"没有可行的替代方案"的化身,但无论如何,也许解决我所看到的问题的这个精简版本可以帮助我了解发生了什么。
grammar NOVIA;
WS : [ trn]+ -> 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
每个可能匹配FigurativeConstant
规则的字符串也将匹配IdWord
规则。由于首先列出IdWord
规则,并且匹配长度与任何规则都相同,因此Lexer发出IdWord
令牌,而不是FigurativeConstant
令牌。
首先列出FigurativeConstant
规则,您将得到您期望的结果。
从风格上讲,您列出规则的顺序模糊了其顺序的重要性,特别是对于Lexer和Parser的必要POV。以antlr/grammar -v4存储库中的语法为例——通常是组合语法、解析器和自顶向下排序。我甚至会大胆猜测,如果你的语法更容易阅读,其他人可能会更早回答。