問題タブ [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 - yyparse() を使用して 2 パス アセンブラを作成しますか?
私が取り組んでいるカスタム マイクロ コントローラーのアセンブラーを書いています。アセンブラが命令をバイナリにアセンブルするところまで到達しました。
ただし、現在、ラベルを機能させるのに問題があります。現在、アセンブラが新しいラベルに遭遇すると、ラベルの名前と参照先のメモリ位置を保存します。命令がラベルを参照すると、アセンブラはラベルを検索し、ラベルを適切な値に置き換えます。
これは素晴らしいことですが、ラベルを参照する命令の後にラベルが定義されている場合はどうなるでしょうか? このため、コードに対してパーサーを 2 回実行する必要があります。
主な機能として現在持っているものは次のとおりです。
これをフレックス/バイソン構成で使用しています。
parsing - 同じアプリケーションで 2 つ以上の Lex/Yacc パーサーを使用することは可能ですか?
ある種類の文法用のパーサーを既に持っているアプリケーションがあり、別の目的のために別の文法を追加する必要があります。
複数持つことは可能ですか?
もしそうなら、どうやって別のエントリポイントを取得しますか?
ありがとう
デビッド・アラン・フィンチ
bison - Lex/Yacc: 入力前にメッセージを表示
lex/yacc (flex/bison) を使用しているときにメッセージ/プロンプトを表示する方法を見つけようとしています。
たとえば、メインは次のようになります。
どちらが yacc を呼び出し、どちらが yylex() を呼び出します。これにより、STDIN で待機する空白行が生成されます。のようなメッセージを表示するにはどうすればよいですか...
それ以外の
アンダースコアはカーソル位置を表し、STDIN からの入力を待機しています...
言及するのを忘れていましたが、プロンプトを繰り返し出力したいと思います...そのため、毎回 lex/yacc が stdin からの入力を要求する前に..
c - flex lexer への文字列入力
flex/bison パーサーを使用して read-eval-print ループを作成したいと考えています。問題は、flex によって生成されたレクサーが FILE* 型の入力を必要としていて、それを char* にしたいということです。とにかくこれを行うことはありますか?
1 つの提案は、パイプを作成し、それに文字列を供給し、ファイル記述子を開き、レクサーに送信することです。これはかなり単純ですが、複雑で、プラットフォームにあまり依存していないように感じます。より良い方法はありますか?
parsing - 不適切な入力を適切に処理しながら、BISON などのパーサー ジェネレーターを使用する
それほど複雑ではない言語のパーサーが必要です。唯一の問題は、パーサーが不正な入力を受け取ったときにエラーを発生させたくないということです。むしろ、Web ブラウザーの HTML パーサーが行うのと同じように、入力を可能な限り意味のあるものにして、そのまま続行することを望んでいます。
私は当然、パーサー ジェネレーターを使用することを考えていましたが、それらを使用した経験はあまりなく、Bison と Antlr で見たすべての例は、構文エラーが発生するとすぐにあきらめる脆弱なパーサーを特徴としています。これはそれらで実行可能ですか、それとも手動でロールすることを検討する必要がありますか? 言語を考えると、おそらく(私が思うに)それほど難しくはないでしょう。
antlr - Bison REJECTアクションに相当するANTLR?
値に空白以外のものを含めることができるペアのリストを解析しようとしてName=Value
います (つまり、値に等号を含めることができます)。
名前は、通常の識別文字に制限されています。
問題は、「値」トークンがすべてに一致することです。たとえば、入力の場合:
パーサーは入力全体を 'Value' トークンと照合します (そして をスローしますMismatchedTokenException
)。
bisonでは、状態をトークンに割り当てる可能性がありました (または、これは非終端記号のためだけでしたか?) ため、その状態への明示的な移行後にのみマッチングの「適格」になります。
編集考えてみると、これはバイソンでも機能しません-トークンの分割はすでに行われています(flex)。REJECT
ただし、トークンへの方法があったと思います。フレックストライに次善のマッチを強制します。
これが私のANTLR文法です。
parsing - ポストインクリメント演算子からの YACC シフト/削減競合を修正するには?
YACC (実際には Bison) で文法を書いていますが、シフト/リデュースの問題があります。これは、後置インクリメント演算子とデクリメント演算子を含めることによって生じます。以下は、文法の縮小版です。
Bison は、12 個のシフト/リデュースの競合があることを教えてくれましたが、接尾辞のインクリメントとデクリメントの行をコメントアウトすると、問題なく動作します。この競合を修正する方法を知っている人はいますか? この時点で、LL(k) パーサー ジェネレーターに移行することを検討しています。これにより、はるかに簡単になりますが、LALR 文法は常に、より自然に記述できるように見えました。GLR も検討していますが、優れた C/C++ GLR パーサー ジェネレーターを知りません。
parsing - コンパイラで前方参照を実装するにはどうすればよいですか?
Lex と YACC (実際には Flex と Bison) でコンパイラを作成しています。この言語では、任意のシンボル (C# など) への無制限の前方参照が可能です。問題は、識別子が何であるかを知らずに言語を解析できないことです。
私が知っている唯一の解決策は、ソース全体を lex してから「幅優先」解析を行うことです。これにより、クラス宣言や関数宣言などのより高いレベルのものは、それらを使用する関数の前に解析されます。ただし、これは大きなファイルの場合に大量のメモリを必要とし、YACC で処理するのは困難です (宣言/本文の種類ごとに個別の文法を作成する必要があります)。また、レクサーを手書きする必要があります (これはそれほど問題ではありません)。
効率についてはあまり気にしません (それでも重要ですが)。これは、完了したらコンパイラ自体を書き直すためですが、そのバージョンを高速にしたいと考えています (高速な一般的なLex/YACC では実行できないが、手動で実行できる手法については、それらも提案してください)。したがって、現時点では、開発の容易さが最も重要な要素です。
この問題に対する良い解決策はありますか? これは通常、C# や Java などの言語のコンパイラでどのように行われますか?