4

私はパーサー ジェネレーターとして Lemon を使用しています。Lemon を知らなくても、エラー処理は yacc や bison のものと同じです。

Lemon には、解析エラーをキャッチするために一連のルールでエラー トークンを定義するオプションがあります。生成されたパーサーのデフォルトの動作は、エラーの原因となったトークンを破棄することです。トークンを保持できるように、この動作をオーバーライドする方法はありますか?

何が起こっているかを示す例を次に示します。基本的に、各ルールのトークンを一緒に追加して、入力文字列を再形成します。文法の例を次に示します。

input ::= string(A) { printf("%s", A); } // Print the result
string(A) ::= string(B) part(C). { A = append(B, C); }
string(A) ::= part(B). { A = B; }
part(A) ::= NUMBER(B) NAME(C). { A = append(C, B); } // Rearrange the number and name
part(A) ::= error(B). { A = B; } // On error keep the token anyways

入力時:

"Username 1234Joseph"

出力が得られます:

"Joseph1234"

テキスト「 Username 」は part(A) ::= error(B) ルールのパーサーによってジャンクされるためですが、私は本当に欲しいです:

"Username Joseph1234"

出力として。

バイソンまたは別のパーサージェネレーターでこの問題を解決できる場合、私はそれを答えとして受け入れます:)

4

2 に答える 2

2

古いものですが、どうして...

文法にはスペースを含める必要があります。現時点では、文法では NUMBER NAME トークンのシーケンスのみが許可されています (トークン間にスペースはありません)。

于 2011-05-27T20:25:05.253 に答える