在我的语法中解决转移 - 减少冲突的问题

Vil*_*lx- 6 grammar parsing irony shift-reduce-conflict

我正在尝试用Irony编写一个小解析器.不幸的是,我得到了"轮班减少冲突".语法不是我的强项,我只需要完成这一小事.这是产生错误的简化语法:

ExpressionTerm := "asd"
LogicalExpression :=
    ExpressionTerm |
    LogicalExpression "AND" LogicalExpression |
    LogicalExpression "OR" LogicalExpression
Run Code Online (Sandbox Code Playgroud)

"转移 - 减少冲突"是什么意思,我该如何解决?我认为这意味着我的语法含糊不清,但我不能充分扭曲我的逻辑,看看如何.

补充:澄清 - "asd"只是一个文字字符串"asd".所以我希望这个语法解析下面的表达式:

asd
asd AND asd
asd AND asd OR asd
asd OR asd AND asd OR asd
Run Code Online (Sandbox Code Playgroud)

补充2:忘了说,语法的根是LogicalExpression.

补充3:啊,我明白了!模棱两可是因为表达式如此

asd AND asd OR asd
Run Code Online (Sandbox Code Playgroud)

可以用两种不同的方式解释:

(asd AND asd) OR asd
asd AND (asd OR asd)
Run Code Online (Sandbox Code Playgroud)

但是我该如何解决这个问题呢?好吧,我可以把AND或OR中的一个强于另一个(无论如何我都打算).但是现在我看到即使只有一个操作员也会出现错误.换句话说,这也会产生相同的错误:

LogicalExpression := "asd" | LogicalExpression "OR" LogicalExpression
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想要这个:

asd OR asd OR asd
Run Code Online (Sandbox Code Playgroud)

要解析为:

(asd OR asd) OR asd
Run Code Online (Sandbox Code Playgroud)

这样做的非模糊方式是什么?

补充4:搞定了!

LogicalExpression1 := LogicalExpression1 "OR" LogicalExpression2 | LogicalExpression2
LogicalExpression2 := LogicalExpression2 "AND" LogicalExpression3 | LogicalExpression3
LogicalExpression3 := "NOT" LogicalExpression4 | LogicalExpression4
LogicalExpression4 := "asd" | "(" LogicalExpression1 ")"
Run Code Online (Sandbox Code Playgroud)

这解析所有布尔表达式,运算符优先级为NOT-> AND-> OR."asd"可以替换为适用于您的条款的表达式.

lep*_*pie 3

如果您只使用一次前瞻,您的语法是不明确的。举例来说,什么是“asd”?它是表达式术语还是更长的术语。这就是移减冲突。我怀疑这里也存在减少-减少冲突。

大多数 LL(1) / LALR(1) 生成器将提供某种方法通过优先级运算符来处理移位归约冲突。在存在移位归约冲突的情况下,大多数也会默认为最长序列,因此通常可以忽略这些序列(经过一些审查)。(在这种情况下,您可能需要将单个术语移至底部才能使其正常运行)。