识别两个不同文字的解析规则

时间:2019-09-21 18:03:26

标签: antlr4

如果我有这样的语法:

g: String -> String ;

String: [A-Z]+ ;

是否可以在语法中编写规则以检查第一个 String 是否与第二个 String 不同? 例如,我想解析一个类似A -> B的字符串! 但是不喜欢这个A -> A。 在令牌相等的情况下,我希望解析器能够引发错误。 我可以用语法做什么?还是只有听众才能验证的东西? (当我在解析树中行走时)。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用谓词来实现该目标,例如:

g: s1 = String '->' s2 = String { s1.getText() != s2.getText() }?;

但是,我不鼓励您这样做。您正在语法阶段进行语义处理,这会导致无用的错误消息,并使以后识别的值的处理更加困难。

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