gpt4 book ai didi

parsing - LALR(1) 函数参数的空列表

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

我有一个简单的 LALR(1) 语法,但是我遇到了一个问题。

start ::= spec.
spec ::= MOD STRING top_stmt.
spec ::= top_stmt.
top_stmt ::= stmt.
top_stmt ::= conditional.
stmt ::= expr.
stmt ::= assignment.
conditional ::= IF stmt_list.
expr ::= retval.
expr ::= NOT retval.
retval ::= access.
retval ::= invoke.
access ::= ns_identifier OBJECT_OPERATOR property_chain.
access ::= ns_identifier.
ns_identifier ::= identifier.
ns_identifier ::= ns_identifier NS_SEPARATOR identifier.
ns_identifier ::=.
property_chain ::= property_chain OBJECT_OPERATOR identifier.
property_chain ::= identifier.
identifier ::= VARIABLE.
identifier ::= STRING.
assignment ::= access ASSIGN expr. [ASSIGN]
stmt_list ::= stmt.
stmt_list ::= stmt_list COMMA stmt. [COMMA]
invoke ::= access LPAREN empty_stmt_list RPAREN.
empty_stmt_list ::=.
empty_stmt_list ::= stmt.
empty_stmt_list ::= empty_stmt_list COMMA stmt. [COMMA]

点标记规则的结束,括号之间的终端分配给它们关联性:ASSIGN 是右关联,COMMA 是左关联。

但是 lemon说它不能减少规则“empty_stmt_list::=”。因为它没有连接到开始符号。我敢打赌 :-)

“调用”也存在解析冲突,当 empty_stmt_list 确实是一个空的语句列表时,它无法在 RPAREN 和 COMMA 之间做出决定。

我想要实现的是能够解析没有(空)参数的函数调用。

其他一切都按预期工作。

谢谢

编辑 :我已经编辑了我的原始帖子并发布了整个精简的语法。

最佳答案

你的第一个问题是我不认为这个位做你想要的:

invoke ::= access LPAREN empty_stmt_list RPAREN.
empty_stmt_list ::=.
empty_stmt_list ::= stmt.
empty_stmt_list ::= empty_stmt_list COMMA stmt. [COMMA]
invoke生产将匹配 access LPAREN COMMA stmt RPAREN ,我认为这是不可取的(这是 LPAREN/COMMA 冲突的来源)。

您可以通过这样做来解决这个问题,这会利用您现有的 stmt_list规则:
invoke ::= access LPAREN maybe_empty_stmt_list RPAREN.
maybe_empty_stmt_list ::= .
maybe_empty_stmt_list ::= stmt_list.

仍然报告冲突(但现在只有 1 个)并且仍然提示 maybe_empty_stmt_list ::=.不能减少。因此,查看 XXX.out 文件以了解它是什么:
State 2:
...
(16) ns_identifier ::= *
...
(25) maybe_empty_stmt_list ::= *
...
RPAREN reduce 25 ** Parsing conflict **
....
{default} reduce 16

...看来问题出在 ns_identifier ::=.规则。回顾所涉及的制作,不难看出一个空的 ns_identifier可以减少到 stmt_list (通过 ns_identifier -> access -> retval -> expr -> stmt -> stmt_list )。

这解释了冲突;而事实是 ns_identifier ::=.在这种情况下,规则受到青睐,因为它出现在语法中的较早位置(请参阅 documentation 中解决归约冲突的规则解释了为什么它提示 maybe_empty_stmt_list ::=. 规则永远不能被归约。

关于parsing - LALR(1) 函数参数的空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2078206/

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