与antlr语法谓词不匹配
我的语法文件中有以下lexer规则:与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的产品。它成功地匹配了上述内容,但我猜我的语法谓词有
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”与行标记匹配,并将后两个选项留给规则,然后将我的产品解析器规则定义为行'->'规则或行'->'行。