0

基本的に次のような文法があります。

start ::= groups.
groups ::= groups group.
groups ::= group.
group(A) ::= IDENTIFIER identparams CURLY_OPEN assignments CURLY_CLOSE SEMICOLON.
group(A) ::= IDENTIFIER CURLY_OPEN assignments CURLY_CLOSE SEMICOLON.
assignments ::= assignments assignment.
assignment ::= IDENTIFIER ASSIGNMENT bool_expr SEMICOLON.

次のように解析します。

name {
     name = "value";
     name2 = "value";
};

それは確かに設定のような名前です。何が起こるかというと:

name = "value" は割り当て ::= 割り当てになります。減少しています。割り当ては定数値であると予想されますが、そうではありません。

P assignment(0x807e778) ::= IDENTIFIER(0x807e728) ASSIGNMENT mvalue SEMICOLON.

P assignments((nil)) ::= assignments((nil)) assignment(0x807e778).
P append 0x807e778 to 0x807e838
P mvalue ::= string.
P assignment(0x807e750) ::= IDENTIFIER(0x807e7c8) ASSIGNMENT mvalue SEMICOLON.
P assignments((nil)) ::= assignments(0x807e838) assignment(0x807e750).
P append 0x807e750 to 0x807e910
P mvalue ::= string.
P assignment(0x807e7f0) ::= IDENTIFIER(0x807e7a0) ASSIGNMENT mvalue SEMICOLON.
P assignments((nil)) ::= assignments(0x807e910) assignment(0x807e7f0).
P append 0x807e7f0 to 0x807e9e8
P group(0x807e7a0) assignments(0x807e9e8) : bind
P groups ::= group(0x807e7a0).

レモンのデバッグ出力はhttp://pastebin.com/yHNkNRpfです

その結果、name2 のみがリストに追加されます。私はこれに困惑しています。reduce は理解していますが、代入者が null に設定され続ける理由はわかりません。これを回避する方法はありますが、私は適切な修正を好みます。

レモンのデバッグ出力はhttp://pastebin.com/yHNkNRpfです

手がかりはありますか?

4

2 に答える 2

0

Pastebin の Lemon パーサー デバッグ出力は、入力トークンを完全に解析していることを示しています。完全な文法が正しいと結論付けることができます。質問から不明なのは、reduce アクションで解析された値をどのように扱うかです。

次の実装を検討してください。解析されたデータを保存するために 2 レベルのリストが導入されました。これは、割り当ての順番リストにあるグループのリストです。すべての割り当てルール パーサーの削減時に、エントリを割り当ての一時リストに追加するアクションを呼び出します。グループ ルールの縮小時に、この一時リストは新しいグループ エントリとしてグループ リストに含まれます。構文エラーの場合、リスト全体が削除されます。解析が正常に完了すると、解析されたすべての値が含まれます。

プログラムの出力によると、新しいリストまたはすべての新しい割り当て値を使用しているようです。

P append 0x807e778 to 0x807e838
P append 0x807e750 to 0x807e910
P append 0x807e7f0 to 0x807e9e8

解析の最後に最後の値しかない理由を説明しています。割り当ての新しいリストは、最初のグループの解析の開始時と、次のグループのグループ ルールのアクション ハンドラで初期化する必要があります。

于 2013-06-07T14:32:40.110 に答える