Antlr4 antlr规则优先级和缺少令牌
关于这一语法:Antlr4 antlr规则优先级和缺少令牌,antlr4,Antlr4,关于这一语法: CHAR : ([a-zA-ZÀ-ÿ0-9] | '.' | '_') ; COLON : (':') ; prefix: ('a' | 'b') ; word : (CHAR)+ ; nested: prefix COLON word ; item : word ; input : ( WS | nested | word)* ; 这个输入: gef a:test abc 我想像解析“单词”一样解析abc,但使用这种语法,“abc”与“嵌套”模式匹配(带有“缺少:冒号
CHAR : ([a-zA-ZÀ-ÿ0-9] | '.' | '_') ;
COLON : (':') ;
prefix: ('a' | 'b') ;
word : (CHAR)+ ;
nested: prefix COLON word ;
item : word ;
input : ( WS | nested | word)* ;
这个输入:
gef a:test abc
我想像解析“单词”一样解析abc,但使用这种语法,“abc”与“嵌套”模式匹配(带有“缺少:冒号”警告)
如何避免“abc”匹配“前缀冒号词”规则
谢谢
弗兰克消除歧义有多种方法。也许最简单的方法是完全描述前缀:
input : ( nested | word)* EOF ;
nested: PREFIX word ;
word : CHAR+ ;
PREFIX: 'a:' | 'b:' ;
CHAR : [a-zA-ZÀ-ÿ0-9] | '.' | '_' ;
WS : [ \r\n\t]+ -> skip ;
添加:
OP语法中的歧义是由于CHAR
规则和为前缀生成的隐式词法规则都与abc
中的初始a
匹配
ANTLR为解析器中指定的每个字符串文本生成隐式lexer规则。这些隐式规则在逻辑上位于lexer语法的顶部/任何显式lexer规则之前。至少,这就是ANTLR的现状和目前的运作方式(在这方面没有官方的ANTLR规范,所以这只是一个工具实现细节)
lexer将在解析器运行之前一直运行到完成。因此,a
很可能被标记为名为T\u a
(隐式lexer规则的名称)的标记,而不是预期的CHAR
最好的建议是不要在解析器中使用字符串文字。实际上,在“真”语法中,我就是这么做的。但我想更好地理解为什么会有歧义,因为“abc”与“a | b”不匹配:“[a-z]*