Antlr4 用于识别两个不同文本的解析规则

Antlr4 用于识别两个不同文本的解析规则,antlr4,Antlr4,如果我有这样的语法: g: String -> String ; String: [A-Z]+ ; 有没有办法在语法中编写规则来检查第一个字符串是否与第二个字符串不同? 例如,我想解析这样的字符串a->B! 但不是像这样的A->A。 如果令牌相等,我希望解析器能够抛出错误。 这是我能用语法做的吗?还是我只能通过一个听众来验证?(当我在解析树中行走时)。谢谢 您可以使用谓词来实现这一点,如: g: s1 = String '->' s2 = String { s1.getText(

如果我有这样的语法:

g: String -> String ;

String: [A-Z]+ ;
有没有办法在语法中编写规则来检查第一个字符串是否与第二个字符串不同? 例如,我想解析这样的字符串
a->B
! 但不是像这样的
A->A
。 如果令牌相等,我希望解析器能够抛出错误。
这是我能用语法做的吗?还是我只能通过一个听众来验证?(当我在解析树中行走时)。谢谢

您可以使用谓词来实现这一点,如:

g: s1 = String '->' s2 = String { s1.getText() != s2.getText() }?;
然而,我不鼓励你那样做。您正在语法阶段进行语义处理,这会导致无用的错误消息,并使以后对已识别值的处理更加困难

相反,将
A->A
解析为语法正确的输入,并在第二步中检查生成的解析树并进行语义检查,如验证不同标识符。如果失败,您可以打印一条漂亮的错误消息,如“标识符必须不同”,而不必处理解析器的消息(这类似于“位置上没有可行的alt…”)