ANTLR 3解析 - 不匹配的角色......期待

时间:2012-03-22 16:14:38

标签: antlr antlr3

我在安静的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,但也没有任何成功。


我该如何解决这个问题呢? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

在这种情况下,ANTLR的词法分析器不能回溯到替代方案。一旦词法分析器看到 ".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'令牌。