gpt4 book ai didi

yacc - 为什么我在 ')' 而不是 '(' 上有移位减少/冲突?

转载 作者:行者123 更新时间:2023-12-04 07:01:04 25 4
gpt4 key购买 nike

我有类似的语法

%(var)


%var


(变量)

我的规则是这样的
optExpr:
| '%''('CommaLoop')'
| '%' CommaLoop

CommaLoop:
val | CommaLoop',' val

Expr:
MoreRules
| '(' val ')'

问题是它似乎无法判断 ) 是否属于 %(CommaLoop)% (val)但它提示的是 ) 而不是 (。到底是什么?它不应该提示 ( 吗?我应该如何修复错误?我认为让 %( 成为一个 token 是一个很好的解决方案,但我想知道为什么 $( 在执行此操作之前不是错误。

最佳答案

这是由于 LR 解析的工作方式。 LR 解析实际上是自下而上的,根据语法规则的 RHS 将标记组合在一起,并用 LHS 替换它们。当解析器“移动”时,它会在堆栈上放置一个标记,但实际上还没有匹配规则。相反,它通过当前状态跟踪部分匹配的规则。当它达到与规则结束相对应的状态时,它可以减少,将 RHS 的符号从堆栈中弹出并将表示 LHS 的单个符号推回。因此,如果存在冲突,则在解析器到达某个规则的末尾并且无法决定是否减少(或减少什么)之前,它们不会出现。

在您的示例中,在看到 后% ( val ,这就是堆栈中的内容(顶部在此处的右侧)。当前瞻为 ) ,它无法决定是否应该通过规则 CommaLoop: val 弹出 val 和 reduce,或者是否应该移动 ) 所以它可以弹出 3 个东西并用规则 Expr 减少:'(' val ')'

我在这里假设你有一些额外的规则,比如 CommaLoop: Expr,否则你的语法实际上不匹配任何东西,bison/yacc 会提示未使用的非终端。

关于yacc - 为什么我在 ')' 而不是 '(' 上有移位减少/冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1830691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com