gpt4 book ai didi

parsing - 由于前瞻标记限制而转移/减少 yacc 中的冲突?

转载 作者:行者123 更新时间:2023-12-02 13:43:39 25 4
gpt4 key购买 nike

我一直在尝试解决看似简单的移位/归约冲突,但无济于事。当然,如果我忽略冲突,解析器就可以正常工作,但如果我重新组织规则,我会感觉更安全。在这里,我将相对复杂的语法简化为单个冲突:

statement_list
: statement_list statement
|
;

statement
: lvalue '=' expression
| function
;

lvalue
: IDENTIFIER
| '(' expression ')'
;

expression
: lvalue
| function
;

function
: IDENTIFIER '(' ')'
;

通过 yacc 中的详细选项,我得到了描述上述冲突状态的输出文件:

state 2

lvalue -> IDENTIFIER . (rule 5)
function -> IDENTIFIER . '(' ')' (rule 9)

'(' shift, and go to state 7

'(' [reduce using rule 5 (lvalue)]
$default reduce using rule 5 (lvalue)

感谢您的帮助。

最佳答案

问题在于,这需要 2 个 token 前瞻才能知道何时到达语句末尾。如果您有以下形式的输入:

ID = ID ( ID ) = ID

解析器移动第二个 ID 后(先行是 (),它不知道这是否是第一个语句的结尾(( 是一个语句的开头)第二条语句),或者这是一个函数。因此它会转移(继续解析函数),这对于上面的示例输入来说是错误的。

如果扩展function以允许括号内的参数和表达式以允许实际表达式,事情会变得更糟,因为所需的前瞻是无限制的——解析器需要一直到第二个 = 以确定这不是函数调用。

这里的基本问题是没有辅助标点符号来帮助解析器找到语句的结尾。由于作为有效语句开头的文本也可能出现在有效语句的中间,因此很难找到语句边界。

关于parsing - 由于前瞻标记限制而转移/减少 yacc 中的冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690558/

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