我正在尝试用Irony编写一个小型解析器。不幸的是,我遇到了“减少班次冲突”。语法不是我的强项,我只需要完成这件小事。这是产生错误的简化语法:
ExpressionTerm := "asd"
LogicalExpression :=
ExpressionTerm |
LogicalExpression "AND" LogicalExpression |
LogicalExpression "OR" LogicalExpression
“班次减少冲突”是什么意思,我该如何解决?我认为这意味着我的语法模棱两可,但我无法充分扭曲我的逻辑以了解如何。
补充:澄清 - “asd”只是一个文字字符串“asd”。所以我希望这个语法会解析以下表达式:
asd
asd AND asd
asd AND asd OR asd
asd OR asd AND asd OR asd
补充2:忘了说,语法的根是LogicalExpression
。
补充3:啊,我明白了!模棱两可是因为像这样的表达
asd AND asd OR asd
可以用两种不同的方式来解释:
(asd AND asd) OR asd
asd AND (asd OR asd)
但是我该如何解决呢?好的,我可以将 AND 或 OR 中的一个设置为比另一个更强大(无论如何我都想这样做)。但是现在我看到即使只有一个操作员也会出现错误。换句话说,这也会产生同样的错误:
LogicalExpression := "asd" | LogicalExpression "OR" LogicalExpression
在这种情况下,我想要这个:
asd OR asd OR asd
要解析为:
(asd OR asd) OR asd
这样做的明确方式是什么?
补充4:知道了!
LogicalExpression1 := LogicalExpression1 "OR" LogicalExpression2 | LogicalExpression2
LogicalExpression2 := LogicalExpression2 "AND" LogicalExpression3 | LogicalExpression3
LogicalExpression3 := "NOT" LogicalExpression4 | LogicalExpression4
LogicalExpression4 := "asd" | "(" LogicalExpression1 ")"
这会解析所有布尔表达式,运算符优先级为 NOT->AND->OR。“asd”可以替换为您的条款的表达方式。