4

単純な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)パラメーターを持たない関数呼び出しを解析できることです。

他のすべては期待どおりに機能します。

ありがとう

編集:元の投稿を編集し、削除された文法全体を投稿しました。

4

2 に答える 2

4

あなたの最初の問題は、このビットがあなたが望むことをしていないと思うことです:

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_listns_identifieraccessretvalexprstmtstmt_list

それが対立を説明しています。この場合、ルールは文法の早い段階で表示されるため、このルールが優先されます(ドキュメントns_identifier ::=.のreduce-reduceの競合を解決するためのルールを参照して、ルールが決して削減できないと文句を言う理由を説明します。maybe_empty_stmt_list ::=.

于 2010-01-16T22:55:37.587 に答える
0

LPAREN / COMMAの優先順位ルールを追加して、他の場所のセマンティクスに影響するかどうかを確認してみてください。

于 2010-01-16T18:12:52.303 に答える