如果我有这样的语法:
g: String -> String ;
String: [A-Z]+ ;
有没有办法在语法中编写规则来检查第一个字符串是否与第二个字符串不同? 例如,我想解析像这样的字符串A -> B
! 但不是这样A -> A
. 在令牌相等的情况下,我希望解析器能够抛出错误。 这是我可以用语法做的事情吗?或者这是我只能与听众验证的东西?(当我在解析树中行走时(。谢谢!
您可以使用谓词来实现这一点,例如:
g: s1 = String '->' s2 = String { s1.getText() != s2.getText() }?;
但是,我不鼓励你这样做。您正在语法阶段进行语义处理,这会导致无用的错误消息,并使以后处理识别的值更加困难。
相反,将A -> A
解析为语法正确的输入,并在第二步中检查生成的解析树并进行语义检查,例如验证不同的标识符。如果失败,您可以打印一条很好的错误消息,例如"标识符必须不同",而不必处理解析器的消息(类似于"位置上没有可行的 alt..."(。