問題タブ [flex-lexer]
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.
compiler-construction - bison と flex でインデントをブロック区切りとして使用する方法
bison + flex でブロック区切り文字としてインデントを実装する方法を知りました。ちょうどパイソンのように。私は独自のプログラミング言語を書いています (主に楽しみのためですが、ゲーム エンジンと一緒に使用するつもりです)。
私はすでに C でコンパイラ (実際には「langToy」から Nasm へのトランスレータ) を作成しましたが、失敗しました。なんらかの理由で、ソース ファイル全体で 1 つの文字列しか処理できませんでした (まあ、私は 48 時間以上起きていたので... ご存知のように、脳のメルトダウンです)。
中括弧および/または begin -> end の実装が簡単なのか (それを行うのに問題はありません)、それともロックアップするのは私の脳だけなのかはわかりません。
前もって感謝します!
更新:わかりました、フレックスでそれを行う方法についての手がかりがありません。複数の DEDENT をパーサーに返すのに問題があります。Flex/Bison は私にとって比較的新しいものです。
更新 2: これは、これまでに思いついたフレックス ファイルです。よくわかりません:
あなたはそれをいじってみることができます、多分あなたは私が欠けているものを見るでしょう. 複数の dedent を返すことは、Haxe では簡単です ( return t_dedent( num ); )。
このコードは、インデント/デデントと常に正しく一致するとは限りません。
更新 3: flex への希望をあきらめて、自分のやり方でやろうと思います。誰かが flex でそれを行う方法を知っていれば、とにかくそれを聞いてうれしいです.
c - Flex(lex)およびBison(yacc)でのエラー処理
バイソンマニュアルから:
各入力が1行である単純な対話型コマンドパーサーでは、エラー時にyyparseが1を返し、それが発生したときに呼び出し元が入力行の残りを無視するようにするだけで十分な場合があります(その後、yyparseを再度呼び出します)。
これは私が望んでいることとほぼ同じですが、仕事に取り掛かるのに苦労しています。基本的には、flexでエラーを検出してエラーを検出し、エラーが検出された場合は、Bisonに行全体を破棄してもらいます。私が今持っているものは、私のコマンドがまだ実行されているため、正しく機能していません:
私のBisonファイル:
そして私のフレックスでは:
c - Flex/LexおよびYacc/Bisonを使用して可変置換を行う方法
ウィキペディアの補間定義 私はフレックス/バイソンを学んでいて、それを使って独自のシェルを書いています。私は変数補間を行うための良い方法を見つけようとしています。これに対する私の最初のアプローチは、ホームディレクトリの〜や$ myVarのようなものをフレックススキャンしてから、ルックアップ関数を使用して返されるものにyyval.stringを設定することでした。私の問題は、テキストが1つのトークンで表示される場合、これは役に立たないということです。
私が変数に対して持っているlex定義:
次に、私の文法には、次のようなものがあります。
この種のことを処理する良い方法を知っている人はいますか?私はこれについてすべて間違っていますか?
g++ - 「yylex()」への未定義の参照
flex と bison を使用して単純なスクリプト言語を作成しようとしています。今、私は電卓を動かそうとしています。
しかし、私はそれをコンパイルすることはできません。このメイクファイルを実行すると:
.l および .ypp ファイルで、次のエラーが発生します。
そして、次のall
ようなコマンドを作成すると:
見つからなかったと表示されます-lfl
。そして、私がこのようにすると:
エラーに戻りundefined reference
ます。
申し訳ありませんが、私はこれについて少し無知です。
編集:フレックスがインストールされています。-lfl から C:/GnuWin32/lib/libfl.a に変更しようとしました (Linux には奇妙な問題があり、まだ Mac を持っていないため、Windows を使用しようとしています)。同じエラー。
c - Flex と Bison との字句結合
一般的な Flex/Bison パラダイムに適合しない言語を認識しようとしています。セマンティック コンテキストに応じて、完全に異なるトークン ルールがあります。例えば:
Bison は明らかにこれらのタイプの文法の認識をサポートしていますが、それらを効果的にサポートするには「字句結合」が必要です。これを行うためのインターフェイスを提供しますが、コンテキストに応じて異なるフレックス正規表現を正確に指定する方法については混乱しています。
前もって感謝します :)
c - GCC と Flex/Bison で効果がないという警告文
プロジェクトを gcc と -Wall オプションを使用してコンパイルすると、flex ファイルの存在しない最後の行に効果のないステートメントに関する警告が表示されます。
警告:
シェル コマンド:
lex ファイルの最後の部分:
この警告が表示される理由を知っている人はいますか?
すべての #line ディレクティブを抑制すると、エラーは次のようになります。
次の ECHO 行を指します。
compiler-construction - コンパイラを書く...何が正しくて何が間違っているのか?
さて、コンパイラを書くために必要なものを見つけようとしているうちに、ちょっとした障害にぶつかりました。私が見つけたすべてのテクノロジーやツールには、どこかで何らかの反対があるようです。
現在 Bison と Flex を使用していますが、この方法は時代遅れだと感じています。これは本当ですか?これは、本格的なプログラミング言語の作成を進めるための優れた前方互換性のある方法ですか?
さまざまな概念とツールの海 (ANTLR、LL(k)、GLR、LALR、LLVM、Flex、Bison) コンパイラを作成するための現在の傾向とベスト プラクティスは何ですか? ドラゴンブックは時代遅れですか?
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行でできる人もいます。この問題にどのようにアプローチしますか?パイソンの答えは私を泣かせるでしょう。真剣に。
c - フレックス、char の定義
char (つまり 'a AND 'a') を定義したいのですが、エラーのチェックに問題があります。ここで、ルールを記述してチェックする方法は次のとおりです。
コード
そして最後にそれをチェックします:
compiler-construction - このプログラム文法は「ID」という名前の変数のみを認識しますか?
次の文法に基づいて、トークンを見つけるために lex/flex でスキャナーを作成し、yacc/bison でこれらのトークンを処理するパーサーを作成する必要があります。スキャナーを作成している最中に、この言語の変数、関数、および配列には「ID」という名前しか付けられないことに気付きました。この yacc ファイルを読み間違えていますか?