与antlr语法谓词不匹配

与antlr语法谓词不匹配,antlr,Antlr,我的语法文件中有以下lexer规则: LINE : 'F' | 'G'; RULE : (('->' ('F' | 'G')) => 'F' | 'G' ) | LINE LINE + | LINE * (ROTATE + LINE+)+ ; fragment ROTATE : ('/' | '\\'); 我基本上是在尝试匹配看起来像F->F/F\F\F/F的产品。它成功地匹配了上述内容,但我猜我的语法谓词有

我的语法文件中有以下lexer规则:

   LINE    :    'F' | 'G';
RULE    :    (('->' ('F' | 'G')) => 'F' | 'G' )
                | LINE LINE + | LINE * (ROTATE + LINE+)+ ;
fragment ROTATE    :    ('/' | '\\');
我基本上是在尝试匹配看起来像F->F/F\F\F/F的产品。它成功地匹配了上述内容,但我猜我的语法谓词有问题,因为G->G产生了不匹配的TokenException。谓词用于消除'->'左侧的单个字母之间的歧义,我希望将其识别为行标记,而右侧的字母应该是规则

知道我做错了什么吗?

注意规则:

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+)+ 
  ;
请注意,规则:

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+)+ 
  ;

行不应该也是一个片段吗?@Anders:不,我语法的其他部分需要它成为一个标记。行不应该也是一个片段吗?@Anders:不,我语法的其他部分需要它成为一个标记。你说得对,但这没有帮助。我重新修改了语法,将“G”或“F”与行标记匹配,并将后两个选项留给规则,然后将我的生成语法分析器规则定义为行'->'规则或行'->'行。你的偏执是对的,但这没有帮助。我重新修改了语法,将“G”或“F”与行标记匹配,并将后两个选项留给规则,然后将我的产品解析器规则定义为行'->'规则或行'->'行。