gpt4 book ai didi

c++ - 如何从 Lemon 语法中删除函数调用歧义?

转载 作者:太空宇宙 更新时间:2023-11-04 14:25:50 30 4
gpt4 key购买 nike

我有以下柠檬语法(从真实语法简化而来):

%right ASSIGN .
%nonassoc FN_CALL .

program ::= expression .
expression ::= expression ASSIGN expression .
expression ::= function_call . [FN_CALL]
expression ::= IDENTIFIER .


function_call ::= expression LPAREN RPAREN . [FN_CALL]

我无法修复以下状态下的 shift-reduce 冲突:

State 3:
expression ::= expression * ASSIGN expression
(1) expression ::= expression ASSIGN expression *
function_call ::= expression * LPAREN RPAREN
ASSIGN shift 1
LPAREN shift 4
LPAREN reduce 1 ** Parsing conflict **
{default} reduce 1

我的想法是问题出在 a=(b(c)) 和 (a=b)(c) 之间的歧义,但我认为给函数调用一个比赋值更高的优先级可以解决这个问题。有什么想法吗?

最佳答案

首先也是最重要的一点:shift-reduce 冲突很少是一个真正的问题。因此,这很可能是您不需要(甚至不关心)修复的问题。

第二点:不幸的是,在我看来您可能过度简化了语法。例如,语法(如您发布的那样)看起来像 a=(b(c))(a=b)(c) 应该是完全拒绝(您唯一指定了 LPAREN 的地方,必须 立即 跟一个 RPAREN)。您发布的内容不足以让我们猜测真正的语法可能有什么问题。

关于c++ - 如何从 Lemon 语法中删除函数调用歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4038832/

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