問題タブ [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.
yacc - 複数の flex/bison パーサー
プロジェクト内で複数の Flex/Bison パーサーを処理する最良の方法は何ですか?
パーサーを作成しましたが、同じプロジェクトで 2 つ目のパーサーが必要になりました。ここまでの 3 番目のセクションで、メソッドparser1.y
を挿入し、そこから呼び出しました。main(..)
yyparse
私が取得したいのは、2 つの異なるパーサー (parser1.y
およびparser2.y
) を持ち、それらを外部関数から使用できるようにすることです ( で想定main
しmain.cpp
ます)。
yyparse
関数をファイルの外部にエクスポートする場合、どのような注意を払う必要が.y
ありますか? また、2 つのパーサーをどのように処理すればよいですか?
PS。私は g++ を使用してコンパイルしていますが、C++ バージョンの Flex と Bison は使用していません。この方法を維持したいと考えています (したがって、オブジェクト内にパーサーをカプセル化することは避けます)。
parsing - Bison の %union ディレクティブ
バイソンパーサーで抽象構文木を使おうとしていたので、%union
ディレクティブを使ってみました。文法ファイルは次のようになります。
現在の状態では、構造体のみを使用しようとしていたため、ファイルast.h
には次の宣言があります。
私は gcc の代わりに g++ を使用していますが、動作するはずです (Web 上で同様の例を見つけました) が、次のエラーが発生するためast_node
、定義時に不明のようです:YYSTYPE
/shady_parser/shady.y:22: エラー: ISO C++ は、タイプのない 'ast_node' の宣言を禁止しています ./shady_parser/shady.y:22: エラー: 期待される ';' '*' トークンの前 ./shady_parser/shady.l: 関数 'int cyylex()' 内: ./shady_parser/shady.l:35: エラー: 'union YYSTYPE' には 'node' という名前のメンバーがありません ./shady_parser/shady .l:37: エラー: 'union YYSTYPE' には 'node' という名前のメンバーがありません./shady_parser/shady.l:38: エラー: 'union YYSTYPE' には 'node' という名前のメンバーがありません
なぜこれが起こるのですか?
次に、ast_node をクラスとして定義し、構造体へのポインターの代わりにそれへのポインターを使用することは可能ですか?
前もって感謝します、ジャック
c - GCC と Flex/Bison で効果がないという警告文
プロジェクトを gcc と -Wall オプションを使用してコンパイルすると、flex ファイルの存在しない最後の行に効果のないステートメントに関する警告が表示されます。
警告:
シェル コマンド:
lex ファイルの最後の部分:
この警告が表示される理由を知っている人はいますか?
すべての #line ディレクティブを抑制すると、エラーは次のようになります。
次の ECHO 行を指します。
compiler-construction - バイソンを使用して要素のリストを解析する
私はシェーディングエンジン用のコンパイラを書いていますが、ステートメントの解析部分に到達するまで、すべてが正常に機能していました。
クラスで定義された抽象構文ツリーを使用して、すべての作業を実行しました(タイプチェックと中間コード生成を簡素化するため)。したがって、祖先クラスASTNode
と、、などのすべての子孫クラスがありASTFloat
ます。ASTExpression
ASTIdentifier
.y
ファイルでは、一般的な方法でASTを構築できます。
そしてそれは非常にうまく機能しますが、それから私はこの方法でスコープのステートメント(例えばifステートメントの本体)を生成しようとしました:私は遭遇した各ステートメントでパーサーによって埋められなければならないASTStatements
リストを持つクラスを使用しました。ASTNode*
したがって、アプローチは次のようになります。
問題は、アイテムがステートメントのブロックごとに1回だけ初期化される必要があるということですが、それを行う方法がわかりません。使用は私が試したハックですが、それまでの内容が含まれている可能性がif ($$ == null)
あるため、機能しません。yylval
バイソンを使用してこの種の状況を処理するための通常の/最良の方法はどれですか?
yacc - BNF文法からのステートマシンの導出
XSSセーフな文字列補間スキームの概念実証をまとめようとしています。
置換された文字列が与えられた場合、
それをリテラル部分と置換("Hello<b>" planetoid "</b>!")
に分割してから、ステートマシンをリテラル部分に対して左から右に実行したいと思います。(上記の)補間値に達したときplanetoid
、状態から適切なエスケープ関数に到達できる必要があります。
lex / yacc / bisonを使用してステートマシンを導出し、文法のラベルを出力状態に関連付ける方法の例を知っている人はいますか?javascriptで使用できるステートマシンを派生させ、PHPの基盤となる文字列実装を置き換えようとしています。
これを行う理由はここに記載されています。
乾杯、マイク
compiler-construction - コンパイラを書く...何が正しくて何が間違っているのか?
さて、コンパイラを書くために必要なものを見つけようとしているうちに、ちょっとした障害にぶつかりました。私が見つけたすべてのテクノロジーやツールには、どこかで何らかの反対があるようです。
現在 Bison と Flex を使用していますが、この方法は時代遅れだと感じています。これは本当ですか?これは、本格的なプログラミング言語の作成を進めるための優れた前方互換性のある方法ですか?
さまざまな概念とツールの海 (ANTLR、LL(k)、GLR、LALR、LLVM、Flex、Bison) コンパイラを作成するための現在の傾向とベスト プラクティスは何ですか? ドラゴンブックは時代遅れですか?
makefile - make を使用して bison 文法を生成する
make
とを使用するプロジェクトではbison
、コンパイルさgrammar.tab.c
れた文法が文法入力grammar.y
に依存すること、各オブジェクト ファイルが対応するソース ファイル (を含むgrammar.tab.o
) に依存すること、および実行可能ファイルがすべてのオブジェクト ファイルに依存することを指定するのが困難です。
問題は、make
grammar.tab.c がまだ存在しないときに実行すると、それをビルドしようとする試みがないことを意味し、実行可能ファイルがビルドされたときにyyparse
関数が欠落していることです。
私Makefile
は:
私がそれを変更した場合:
次に、コンパイルされた文法がまだ存在しない場合は構築します。しかし、それが既に存在する場合、実行可能ファイルをビルドするときに、yyparse
2 回提供されるというエラーが発生します (おそらく、 2 回$OBJ
含まれているためgrammar.tab.o
)。
私が目指しているのは、次のような Makefile です。
- コマンドで実行可能ファイルを正しくビルドし、
make
必要に応じて中間ファイルを再ビルドします。 - ディレクトリ内のすべての
*.c
ファイルを取得します (つまり、新しいソース ファイルが追加されたときに変更する必要はありません)。 - 読みやすく、理解しやすい。
make
一度に1 つか 2 つだけである限り、新しい機能を学ぶことは気にしません。
他の人の文法構築 Makefile はどのように機能しますか?
編集OK、それらは素晴らしい答えです。最小の変更だったので、フィルターを外したものを使用しました。私が話していることをみんなが正確に理解しているように見えて本当にうれしいです -- automake のような複雑なものを使うように言われるのが心配でした ;-)。
みんな、ありがとう。
c - 文法の左再帰は競合を引き起こします
Bisonの文法全体を通して、私は右再帰を使用しています。最初にスタック全体を構築する必要がないため、左再帰の方が優れていることを読みました。
しかし、それらのいずれかで左再帰に切り替えようとすると、常に多くの競合が発生し、その理由がわかりません。
右の代わりに左の再帰を使用すると競合が発生する一般的な例を誰かに教えてもらえますか(右の再帰が競合を引き起こさない場合)。次に、そのような競合を修正するために左に切り替えるときに何をする必要がありますか。基本的な例は、自分の文法を修正するだけでは不十分だと思います。
編集:
しかし、私の理解は完全ではないので、とにかく特定の例を含める必要があると思います:-)「listseparatorcommand」を「commandseparatorlist」に変更すると競合が解決します。
c - Bison の $$ 変数を GDB で調べる
Bison .y ファイルにブレークポイントを設定した場合、そのブレークポイントで $$ 疑似変数の内容を調べる方法はありますか?
python - 2つ以上のデータファイルの選択的マージ
入力が次の形式のASCIIファイルに含まれている実行可能ファイルがあります。
言い換えると、いくつかの一般的な入力と、いくつかの新しいインスタンスのいくつかのパラメーター値です。パラメータの宣言は不規則です。一部の数値はコンマで区切られ、その他は科学的記数法で、その他は引用符で囲まれ、間隔は一定ではありません。
一部のシナリオの評価では、1つの「マスター」データファイルを入力し、たとえばインスタンス2〜6のパラメータデータを、そのインスタンスのデータがすでに含まれている可能性のある別のデータファイルにコピーする必要があります(この場合、データは上書きされる)および場合によっては他のデータ(変更されないままにする必要があるデータ)。
FlexレクサーとBisonパーサーを作成しました。一緒にデータファイルを食べて、パラメータをメモリに保存できます。それらを使用して両方のファイル(マスターと「シナリオ」)を開く場合、3番目の新しいファイルに(のように"general input from 'scenario'; instances 1 though 5 from 'master'; instances 6 through 9 from 'scenario'; ..."
)必要なパラメーターを選択的に書き込み、保存して、元のシナリオファイルを削除するのはそれほど難しくありません。
その他の情報:(1)ファイルは非常に機密性が高いため、ユーザーがマスターファイルを変更しないように完全に保護することが非常に重要です。(2)ファイルは管理可能なサイズ(500Kから10M)です。
私は10行のコードで何ができるかを学びました。ここにいる仲間の中には2行でできる人もいます。この問題にどのようにアプローチしますか?パイソンの答えは私を泣かせるでしょう。真剣に。