問題タブ [yacc]
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.
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
バイソンを使用してこの種の状況を処理するための通常の/最良の方法はどれですか?
c - flex/lex yacc/bison マルチスレッド環境
マルチスレッド環境で flex/bison|lex/yacc によって生成されたコードを使用できますか? グローバル変数がたくさんあると思います。どうすれば修正できますか?
yacc - BNF文法からのステートマシンの導出
XSSセーフな文字列補間スキームの概念実証をまとめようとしています。
置換された文字列が与えられた場合、
それをリテラル部分と置換("Hello<b>" planetoid "</b>!")
に分割してから、ステートマシンをリテラル部分に対して左から右に実行したいと思います。(上記の)補間値に達したときplanetoid
、状態から適切なエスケープ関数に到達できる必要があります。
lex / yacc / bisonを使用してステートマシンを導出し、文法のラベルを出力状態に関連付ける方法の例を知っている人はいますか?javascriptで使用できるステートマシンを派生させ、PHPの基盤となる文字列実装を置き換えようとしています。
これを行う理由はここに記載されています。
乾杯、マイク
c - 文法の左再帰は競合を引き起こします
Bisonの文法全体を通して、私は右再帰を使用しています。最初にスタック全体を構築する必要がないため、左再帰の方が優れていることを読みました。
しかし、それらのいずれかで左再帰に切り替えようとすると、常に多くの競合が発生し、その理由がわかりません。
右の代わりに左の再帰を使用すると競合が発生する一般的な例を誰かに教えてもらえますか(右の再帰が競合を引き起こさない場合)。次に、そのような競合を修正するために左に切り替えるときに何をする必要がありますか。基本的な例は、自分の文法を修正するだけでは不十分だと思います。
編集:
しかし、私の理解は完全ではないので、とにかく特定の例を含める必要があると思います:-)「listseparatorcommand」を「commandseparatorlist」に変更すると競合が解決します。
c - Bison の $$ 変数を GDB で調べる
Bison .y ファイルにブレークポイントを設定した場合、そのブレークポイントで $$ 疑似変数の内容を調べる方法はありますか?
c - 競合をシフト/削減する yacc
次の yacc のコードを参照してください。生産要素を削除すると: '!' expr を使用すると、解析の競合がなくなります。ここで何が起きてるの?