2010-05-03 131 views
1

我在语法文件以下词法规则:mismatchedtoken ANTLR的语法谓词

LINE : 'F' | 'G'; 
RULE : (('->' ('F' | 'G')) => 'F' | 'G') 
       | LINE LINE + | LINE * (ROTATE + LINE+)+ ; 
fragment ROTATE : ('/' | '\\'); 

基本上,我试图匹配的制作,看起来像的F - > F/F \˚F\ F/F。它成功匹配上面的东西,但我猜我的语法谓词有问题,因为G - > G会产生MismatchedTokenException。谓词用于消除在' - >'的lhs上的单个字母之间的歧义,我希望将其识别为LINE令牌,而在rhs上的那些符号应该是RULE。

任何想法我做错了什么?

+0

不宜行片段太? – 2010-05-05 13:32:33

+0

@安德斯:不,我的语法的其他部分需要它作为标记 – varzan 2010-05-15 16:14:10

回答

1

注意以下规则:

RULE 
    : (('->' ('F' | 'G')) => 'F' | 'G') 
    | LINE LINE + 
    | LINE * (ROTATE + LINE+)+ 
    ; 

匹配单个G没有谓语。上面的规则可以被改写为:

RULE 
    : (('->' ('F' | 'G')) => 'F' 
    | 'G' 
    ) 
    | LINE LINE + 
    | LINE * (ROTATE + LINE+)+ 
    ; 

这反过来等于:

RULE 
    : ('->' ('F' | 'G')) => 'F' 
    | 'G' 
    | LINE LINE + 
    | LINE * (ROTATE + LINE+)+ 
    ; 

也许你打算做这样的事情:

RULE 
    : ('->' ('F' | 'G')) => ('F' | 'G') 
    | LINE LINE + 
    | LINE * (ROTATE + LINE+)+ 
    ; 
+0

你是对的,但没有帮助。我通过将'G'或'F'与LINE令牌进行匹配并将RULE的后两种选择留给RULE,然后将生成的解析器规则定义为LINE' - >'RULE或LINE' - >'LINE。 – varzan 2010-05-15 16:17:06

+0

好的。很高兴听到你解决它! – 2010-05-15 16:56:49