我有一个简单的 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 是左关联的。
但是柠檬说它不能减少规则“empty_stmt_list ::=”。因为它没有连接到开始符号。我敢打赌 :-)
“invoke”也存在解析冲突,当empty_stmt_list确实是一个empy语句列表时,它无法在RPAREN和COMMA之间做出决定。
我想要实现的是能够解析没有(void)参数的函数调用。
其他一切都按预期工作。
谢谢
编辑:我已经编辑了我的原始帖子并发布了整个精简的语法。