Antlr语法谓词-不匹配字符

Antlr语法谓词-不匹配字符,antlr,antlr3,Antlr,Antlr3,我的语法如下: SPACE : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;}; NAME_TAG : 'name'; IS_TAG : 'is'; START : 'START'; END : ('END START') => 'END START' ; WORD : 'A'..'Z'+; rule : START NAME_TAG IS_TAG WORD END; 并且想要解析像“START name是END START”这样的语

我的语法如下:

SPACE : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;};
NAME_TAG : 'name';
IS_TAG : 'is';

START : 'START';
END : ('END START') => 'END START'  ;

WORD    : 'A'..'Z'+;

rule :  START NAME_TAG IS_TAG WORD END;

并且想要解析像“START name是END START”这样的语言。这里的问题是结束标记,因为“结束”(单词+空格)被误解了。我认为正确的方法是使用语法谓词(END token),但可能我错了。

我不会创建由空格分隔的2个(或更多)单词的标记。为什么不将
'END'
标记为和
END
-标记,然后执行以下操作:

rule     : START NAME_TAG IS_TAG word END START;
word     : WORD | END; // expand this rule, as you see fit
NAME_TAG : 'name';
IS_TAG   : 'is';
START    : 'START';
END      : 'END';
WORD     : 'A'..'Z'+;
SPACE    : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;};
它将把“开始名为结束-开始”解析到以下解析树中:

编辑 您所做的错误是没有给lexer规则在谓词失败时恢复的可能性。以下是谓词的正确用法:

rule     :  START NAME_TAG IS_TAG WORD END;

SPACE    : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;};
NAME_TAG : 'name';
IS_TAG   : 'is';
START    : 'START';
WORD     : ('END START')=> 'END START' {$type=END;}
         | 'A'..'Z'+
         ;

fragment END : ;

非常感谢。您能告诉我语法定义中的错误吗?@user1286372,请参阅我的编辑。虽然我更喜欢我的第一个建议,而不是第二个。啊,好吧,那么一个句法谓词只有在至少有一条其他规则的情况下才有意义?