問題タブ [bison]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parsing - Flex を使用して 2 パス スキャナーを実装するにはどうすればよいですか?
ペット プロジェクトとして、Web スクリプト言語として使用できる、独自の設計による基本的な言語の実装を試みたいと考えています。C++ プログラムを Apache CGI として実行するのは簡単なので、実際の作業は、非コード (HTML/CSS マークアップ) とサーバー側コードを含む入力ファイルを解析する方法にあります。
学部生のコンパイラ コースでは、FlexとBisonを使用して、単純な言語のスキャナーとパーサーを生成しました。私たちは文法のコピーを受け取り、単純な言語を仮想マシン用の単純なアセンブリに変換するパーサーを作成しました。flex スキャナーは入力をトークン化し、トークンを Bison パーサーに渡します。
それと私がやりたいことの違いは、PHP のように、この言語にはプレーンな HTML マークアップと、次のように散在するスクリプト言語を含めることができるということです。
次のように入力ファイルを解析するのが効率的であると仮定するのは間違っていますか?
- スクリプト開始タグが見つかるまで入力をスキャンします ('
- 2 番目のスキャナーは、入力ファイルのサーバー側スクリプト セクションを (開始タグ: '' から) トークン化し、そのトークンをパーサーに渡します。パーサーは、ファイル内のマークアップについて知る必要はありません。
- 制御は、この一般的なパターンを継続する最初のスキャナーに戻されます。
基本的に、最初のスキャナーは、マークアップ (変更されずにブラウザーに直接返される) と、2 番目のスキャナーに渡されるコードのみを区別します。2 番目のスキャナーは、コードをトークン化し、トークンをパーサーに渡します。
これが堅実な設計パターンでない場合、PHP などの言語はどのようにして入力のスキャンとコードの解析を効率的に処理するのでしょうか?
c++ - Antlrの利点(たとえば、lex / yacc / bison)
私は過去にさまざまなプロジェクト、通常は翻訳者(EDAアプリにストリーミングされたEDIFのサブセットなど)にlexとyacc(より一般的にはbison)を使用しました。さらに、数十年前にさかのぼるlex/yacc文法に基づくコードをサポートする必要がありました。ですから、私は専門家ではありませんが、ツールの使い方を知っています。
私は過去にさまざまなフォーラムでAntlrについて前向きなコメントを見てきましたが、何が欠けているのか興味があります。したがって、両方を使用したことがある場合は、Antlrで何が優れているかより高度であるかを教えてください。私の現在の制約は、私がC ++ショップで働いていることであり、出荷する製品にはJavaが含まれないため、結果として得られるパーサーはその規則に従う必要があります。
c++ - bison で生成されたパーサーのパーサー状態をクリアする
Flex で生成された C lexer と、Bison で生成された C++ パーサーを使用しています。文字列入力のみを受け入れるようにパーサーを変更しました。
ループ内でパーサー関数yyparse()
を呼び出し、ユーザー入力を 1 行ずつ読み取っています。入力が「終了」の場合、ループを停止します。
私が直面している問題は、入力がどのルールにも一致しない場合、パーサーが突然停止し、次の反復で同じ状態で開始され、(構文エラーのために) 停止されたルールが完了することを期待していることです。
入力が有効で、パーサー ルールと一致する場合は正常に機能します。
構文エラーでyyerror()
、単純なエラー メッセージを表示する関数を再定義しました。
入力がどのパーサー ルールとも一致しない場合にパーサーの状態をクリアして、次の反復でパーサーが新たに開始されるようにするにはどうすればよいですか?
bison - bison / yacc の最新 ( CLR など) の代替品はありますか?
bison を使用して記述された古いコンパイラのようなコードを少しだけ作り直しました。私がこれをしている間、現代の同等物は何だろうと思っていました。BNF 文法を取得し、解析を行う DLL を分割するフレームワークを記述する素敵な .NET (または同様の) コンパイラはありますか?
parsing - 簡単なパーサーの開発
私の日常の仕事には、Pascal ライクなコンパイラの開発作業が含まれます。私はずっと最適化とコード生成に取り組んできました。
また、同じ言語用の単純なパーサーを作成する方法を学びたいと思っています。ただし、これについてどうすればよいかよくわかりません。Flex と Bison が選択されているようです。しかし、C++ や C# を使用してパーサーを作成することはできませんか? 私はCに少し不気味です。
Yacc++ は C# をサポートしていますが、ライセンスが必要です。この点に関して、私が見つけることができるすべての助けを探しています。提案をいただければ幸いです。
gdb - GDBを使用したBison生成コードのデバッグ
Bisonで生成されたコードで定義されているyyparse関数にステップインしようとしていますが、GDBから次のようなメッセージが表示されます。
Reading file "foo.tab.c"...No such file or directory.
Bisonによって生成されたファイルはfoo.ccと呼ばれます。foo.tab.c
代わりに、なぜそれを探しているのですか?
parsing - あいまいな文法やプロダクション ルールが問題ないのはいつですか? (バイソンシフト/警告を減らす)
shift/reduce エラーの解決に関するドキュメントやハウツーは確かにたくさんあります。bison のドキュメントでは、正しい解決策は通常、それらを単に期待して対処することであると示唆しています。
あなたがこのようなものを持っているとき:
次のように簡単に解決できます。
私の質問は次のとおりです。文法を少しあいまいにして %expect shift/reduce の問題を残す方が良いですか、それとも文法を調整してそれらを回避する方が良いですか? バランスがあり、作者のニーズに基づいているのではないかと思いますが、よくわかりません。
parsing - Flex/LexとYacc/Bisonの違いは何ですか?
Flex&LexとYacc&Bisonの違いは何ですか。私はインターネットを乱暴に検索しましたが、確かな答えは見つかりませんでした。
Ubuntuに純粋なLexとYaccをインストールできますか、それともflexとbisonのみをインストールできますか。私は混乱しています。
- LexまたはYaccはまだ誰かによって維持されていますか?
- それらはすべて無料ですか?
Lexが無料でない場合、なぜUbuntuディストリビューションにインストールするのですか?
/li>
bison - flex はどのように bison-location を正確にサポートしていますか?
複雑な言語から特定の文法要素を取得したいので、flex と bison を使用してフィルターを作成しようとしています。私の計画は、flex + bison を使用して文法を認識し、関心のある要素の場所をダンプすることです。(次に、スクリプトを使用して、ダンプされた場所に従ってテキストを取得します。)
flex は bison-locations と呼ばれる bison 機能をサポートできることがわかりましたが、それが正確にどのように機能するか. 私はフレックスドキュメントで例を試しました.yyllocはフレックスによって自動的に設定されていないようです.私はいつも(1,0)-(1,0)
. flex は各トークンの位置を自動的に計算できますか? そうでない場合、実装するためにどのインターフェイス関数が定義されていますか? 例はありますか?
ツールに関するより良い解決策はありますか?
よろしく、 ケビン
編集:
yylex のインターフェースは次のようになります。
bison のマニュアルでは、yylloc_param を正しく設定するためにレクサーがどのように実装する必要があるかを指定していません。私にとって、各トークンの列番号を手動で追跡するのは困難です。