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"可以替换为适用于您的条款的表达式.
如果您只使用一次前瞻,您的语法是不明确的。举例来说,什么是“asd”?它是表达式术语还是更长的术语。这就是移减冲突。我怀疑这里也存在减少-减少冲突。
大多数 LL(1) / LALR(1) 生成器将提供某种方法通过优先级运算符来处理移位归约冲突。在存在移位归约冲突的情况下,大多数也会默认为最长序列,因此通常可以忽略这些序列(经过一些审查)。(在这种情况下,您可能需要将单个术语移至底部才能使其正常运行)。
| 归档时间: |
|
| 查看次数: |
3446 次 |
| 最近记录: |