【发布时间】:2019-02-14 18:16:11
【问题描述】:
我正在编写一个编程语言解析器,但我陷入了这种 Shift/Reduce 冲突。
这是通过使用-v运行bison获得的parser.output文件中的冲突状态
State 1
24 ident: TIDENT .
26 call: TIDENT . TLPAREN args TRPAREN
TLPAREN shift, and go to state 24
TLPAREN [reduce using rule 24 (ident)]
$default reduce using rule 24 (ident)
当我尝试实现调用规则时发生冲突,它似乎与正常的 ident 规则冲突。
这是语法的一些部分,(为简单起见删除了操作,但它们不应该是必需的。我也不确定定义规则的顺序是否重要,如果我错了,请纠正我)
(大写字母是记号)
ident 规则很简单
ident: TIDENT
;
Args,通过调用使用。
args: /* empty */
|
expr
|
args TCOMMA expr
;
调用函数调用
call:
TIDENT TLPAREN args TRPAREN
;
表达式的表达式
expr:
number
|
ternary
|
bool
|
string
|
ident
|
call
|
TLPAREN expr TRPAREN
|
expr TPLUS expr
|
expr TMINUS expr
|
expr TSLASH expr
|
expr TSTAR expr
|
expr TGT expr
|
expr TGE expr
|
expr TLT expr
|
expr TLE expr
;
问题:为什么语法会有移位/归约冲突,如何解决?我见过类似的风格解析器没有冲突,这真的很奇怪。
如果您需要查看完整的复现语法,请查看 hastebin https://hasteb.in/zozifopi.shell
如果您需要有关其他任何内容的更多详细信息,请在 cmets 中告诉我,我会相应地编辑问题。
【问题讨论】:
-
欢迎来到 Stck Overflow。请尽快阅读 How to Ask 和 About 页面,但更紧急的是,阅读有关如何创建 MCVE (minimal reproducible example) 的信息。您提供了语法的片段,但不是完整的、最小的语法来重现您遇到的问题。我们必须努力工作,看看发生了什么;我们不能只是从您的问题中复制粘贴。
-
抱歉,刚刚编辑包含完整代码
-
完整代码不是我们想要的——MCVE 中的Minimal 也很重要。我会看看它。我对您语法的最小版本的第一次猜测没有重现您的 SR 冲突(它有一个 SR 冲突,但不是那个)。
-
@pollen:完整代码与“在某个时间点包含代码的 pastebin 的链接”不同。您应该包括整个语法以及相关声明(优先级和标记声明;语义声明仅在与您的问题相关时)。就个人而言,我很欣赏不使用太多垂直空白的样式,因为我经常使用小屏幕设备查看问题。但这只是我;你不需要考虑它。重要的是,包含的代码无需修改即可使用,并且存在问题。
标签: c parsing bison yacc compiler-compiler