【发布时间】:2010-01-16 17:05:00
【问题描述】:
我有一个简单的 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 ::=”。因为它没有连接到开始符号。我敢打赌是:-)
“invoke”也存在解析冲突,当empty_stmt_list确实是一个empy语句列表时,它无法在RPAREN和COMMA之间做出决定。
我想要实现的是能够解析没有(void)参数的函数调用。
其他一切都按预期工作。
谢谢
编辑:我已经编辑了我的原始帖子并发布了整个精简的语法。
【问题讨论】:
-
你的符号并不完全是传统的——它是受 ANTLR 启发的吗?括号中的“(A)”和“(B)”是什么?孤独的'。'有什么意义?在符号?它似乎是一个表示规则结束的元字符,接下来是动作。
标签: parsing grammar lalr lemon