我在安静的ANTLR安静了,我环顾了一会儿来解决我的问题。不幸的是没有任何成功......
我简化了我的语法来描述问题(在实际例子中使用了令牌TAG):
grammar Test;
WORD : ('a'..'z')+;
DOT : '.';
TAG : '.test';
WHITE_SPACE
: (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;};
rule
: 'a' DOT WORD 'z';
当我尝试解析“a .bcd z”这个词时,一切都很好,但当我尝试“a .tbyfa z”这个词时,它会向我显示错误
line 1:4 mismatched character 'b' expecting 'e' line 1:5 missing DOT at 'yfa'
在我看来,问题是“。”之后的字符串。以“t”开头,也可以是令牌“.test”。我试过backtrack = true,但也没有任何成功。
我该如何解决这个问题呢?
提前谢谢。
答案 0 :(得分:2)
".t"
,它会尝试匹配TAG
令牌,但这不会成功,因此词法分析器会尝试匹配以{{{}开头的其他内容。 1}},但没有这样的标记。词法分析器将不再次回溯一个字符以匹配".t"
。这就是出了什么问题。
可能的解决方案是这样做:
DOT
grammar Test;
rule : 'a' DOT WORD 'z';
WORD : ('a'..'z')+;
DOT : '.' (('test')=> 'test' {$type=TAG;})?;
SPACE : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;};
fragment TAG : /* empty rule: only used to change the 'type' */;
是一个句法谓词,它强制词法分析器向前看,看看前面是否确实存在('test')=>
。如果是这样,则"test"
匹配,并且令牌的类型更改为"test"
。由于TAG
是可选的,因此该规则始终只能依赖于'test'
令牌。