私はパーサー ジェネレーターとして 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"
出力として。
バイソンまたは別のパーサージェネレーターでこの問題を解決できる場合、私はそれを答えとして受け入れます:)