与antlr句法谓词不匹配

时间:2010-05-03 13:31:17

标签: 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的那些字母。

知道我做错了吗?

1 个答案:

答案 0 :(得分: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+)+ 
  ;