如果我有这样的语法:
g: String -> String ;
String: [A-Z]+ ;
是否可以在语法中编写规则以检查第一个 String 是否与第二个 String 不同?
例如,我想解析一个类似A -> B
的字符串!
但是不喜欢这个A -> A
。
在令牌相等的情况下,我希望解析器能够引发错误。
我可以用语法做什么?还是只有听众才能验证的东西? (当我在解析树中行走时)。谢谢!
答案 0 :(得分:1)
您可以使用谓词来实现该目标,例如:
g: s1 = String '->' s2 = String { s1.getText() != s2.getText() }?;
但是,我不鼓励您这样做。您正在语法阶段进行语义处理,这会导致无用的错误消息,并使以后识别的值的处理更加困难。
将语法A -> A
解析为语法正确的输入,然后在第二步中检查生成的语法树并进行语义检查,例如验证不同的标识符。如果失败,您可以打印一条不错的错误消息,例如“标识符必须不同”,而不必处理解析器的消息(这将是“位置上没有可行的替代……”之类的东西。)