Parsing LALR(1)函数参数的空列表

Parsing LALR(1)函数参数的空列表,parsing,grammar,lalr,lemon,Parsing,Grammar,Lalr,Lemon,我有一个简单的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 ::

我有一个简单的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为right associative,逗号为left-assoc

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

“invoke”还有一个解析冲突,当空的语句列表实际上是一个临时语句列表时,它无法在rpare和逗号之间做出决定

我试图实现的是能够解析没有(void)参数的函数调用

其他一切都按预期进行

谢谢


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

您可以尝试为LPAREN/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 rpare
,我认为这是不可取的(也是LPAREN/COMMA冲突的根源)

您可以这样做来解决这个问题,它利用了您现有的
stmt\u列表
规则:

invoke ::= access LPAREN maybe_empty_stmt_list RPAREN.
maybe_empty_stmt_list ::= .
maybe_empty_stmt_list ::= stmt_list.
它仍然报告冲突(但现在只有1个),并且仍然抱怨
可能是空的\u stmt\u list::=。
无法减少。因此,在XXX.out文件中查看它是什么:

State 2:
...
     (16) ns_identifier ::= *
...
     (25) maybe_empty_stmt_list ::= *
...
                        RPAREN reduce 25  ** Parsing conflict **
....
                     {default} reduce 16
…问题似乎出在
ns\u标识符::=。
规则上。回顾所涉及的制作,不难看出空的
ns\u标识符
可以简化为
stmt\u列表
(通过
ns\u标识符
->
访问
->
检索
>
->
expr
stmt
->
stmt
->
stmt list


这就是冲突的原因;事实上,在这种情况下,
ns\u标识符::=。
规则是受欢迎的,因为它出现在语法的前面(请参阅中的解决减少冲突的规则解释为什么它抱怨
可能是空的\u stmt\u列表::=。
规则永远不能减少。

您的符号不完全是传统的-它是ANTLR启发的吗?括号中的“(A)”和“(B)是什么“stuff?lone的意义是什么?”在符号中?它似乎是一个元字符,表示规则的结束,接下来是动作。多亏了一大堆,我完全修复了它,包括删除了空的ns_identifier规则,它实际上是一个工件,用于解决另一个旧问题。self注意:设计语言解析器需要c都是“做对了”的心态。接受答案。