単純な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が実際にステートメントの空のリストである場合、RPARENとCOMMAのどちらかを決定することはできません。
私が達成しようとしているのは、(void)パラメーターを持たない関数呼び出しを解析できることです。
他のすべては期待どおりに機能します。
ありがとう
編集:元の投稿を編集し、削除された文法全体を投稿しました。