2

Flex で生成された C lexer と、Bison で生成された C++ パーサーを使用しています。文字列入力のみを受け入れるようにパーサーを変更しました。

ループ内でパーサー関数yyparse()を呼び出し、ユーザー入力を 1 行ずつ読み取っています。入力が「終了」の場合、ループを停止します。

私が直面している問題は、入力がどのルールにも一致しない場合、パーサーが突然停止し、次の反復で同じ状態で開始され、(構文エラーのために) 停止されたルールが完了することを期待していることです。

入力が有効で、パーサー ルールと一致する場合は正常に機能します。

構文エラーでyyerror()、単純なエラー メッセージを表示する関数を再定義しました。

入力がどのパーサー ルールとも一致しない場合にパーサーの状態をクリアして、次の反復でパーサーが新たに開始されるようにするにはどうすればよいですか?

4

2 に答える 2

2

私の Lex & Yacc book によると、関数 yyrestart(file) があります。

そうでなければ(そして私は本の段落を引用します:

これは、yylex() を呼び出すだけではレクサーを再起動できないことを意味します。BEGIN INITIAL を使用してデフォルト状態にリセットし、unput() によってバッファリングされた入力テキストを破棄し、そうでなければ、input() への次の呼び出しが新しい入力の読み取りを開始するように調整する必要があります。

于 2008-10-21T21:11:30.673 に答える
0

興味深い質問です。私は Bison、Byacc、MKS Yacc、または Unix Yacc でコンパイルできるパーサーを持っています。文法の失敗または成功に関係なく、文法のリセットに対処するために特別なことは何もしていません。Flex または Lex トークナイザーは使用しません。これは手作業でコード化されていますが、文字列から厳密に機能します。だから、私はGamecatに同意しなければなりません。問題の原因として最も可能性が高いのは、適切なパーサーではなく、語彙アナライザーです。

(私のコードを入手したい場合は、IIUG (International Informix User Group) Web サイトから SQLCMD をダウンロードできます。完全な製品には Informix ESQL/C が必要ですが、原則として、文法はスタンドアロンのテスト プログラムに変換できます。残念ながら、私はそのテストをしばらく実行していないようです - テストのコンパイルにいくつかの問題があります. 2006 年 4 月に一部の構造要素名が変更されました. さらに、リンケージの問題もあります. コードを再編成する必要があります.文法をスタンドアロンで再度テストできるようにします。)

于 2008-10-21T22:17:07.547 に答える