問題タブ [lex]
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.
php - PHPのLexとYacc
PHPにLexとYaccの実装はありますか?
そうでない場合は、PHPコードを作成する字句アナライザーとパーサージェネレーター(つまり、LexやYaccなど)を提案できますか?結果として得られるパーサーのパフォーマンスについてはあまり心配していません。
正規表現で解析すべきではないものを正規表現で解析することにうんざりしています...
bison - フレックスとバイソンの実際の例はどこにありますか?
flex と bison の例が必要なので、ast ツリーとシンボル テーブルを構築し、意味解析を行う方法を学ぶことができます。
emacs - lex/flex/yacc/bison ファイルに適した Emacs モードまたは方法はありますか?
Emacs で lex または yacc ファイルを編集するのは面倒です。C モードを使用するとインデントがうまくいかず、C モードを使用しないとインデントを使用できません。誰もそれを回避するためのトリック、方法、または編集モードを持っていますか?
c++ - C++ のトークナイザーを生成するための lex/flex よりも優れた (より現代的な) ツールはありますか?
最近、複雑なコマンド ライン引数から出力ファイルを生成する既存のツールに、ソース ファイルの解析機能を追加しました。
コマンド ライン引数が非常に複雑になったため、非常に大きなコマンド ラインであるかのように解析されるファイルとして提供できるようになりましたが、構文は依然として扱いにくいものでした。そこで、より合理的な構文を使用してソース ファイルを解析する機能を追加しました。
Windows 用の flex 2.5.4 を使用して、このカスタム ソース ファイル形式のトークナイザーを生成しましたが、うまくいきました。しかし、私はコードが嫌いでした。グローバル変数、変な命名規則、そしてそれが生成する C++ コードはひどいものでした。既存のコード生成バックエンドは flex の出力にくっついていました - 私は yacc も bison も使いません。
私はそのコードに飛び込もうとしていますが、より優れた/より最新のツールを使用したいと考えています。誰かがそれを知っていますか。
- Windows コマンド プロンプトで実行します (Visual Studio との統合は問題ありませんが、ビルドには make ファイルを使用します)
- カプセル化された適切な C++ トークナイザーを生成します。(グローバル変数なし)
- トークン化ルールを記述するために正規表現を使用します (lex 構文と互換性があります)。
- ファイルの読み取りに c-runtime を使用する (または偽造する) ことを強制しません。(メモリから解析)
- ルールによってトークナイザーがバックトラックする (または自動的に修正する) 場合に警告します
- 変数名とメソッド名を完全に制御できます (既存の命名規則に従うことができます)
- 名前の競合なしに、複数のパーサーを単一の .exe にリンクできます
- 必要に応じて UNICODE (16 ビット UCS-2) パーサーを生成できます
- 統合されたトークナイザー + パーサージェネレーターではありません (lex + yacc の置き換えではなく、lex の置き換えが必要です)
トークン化テーブルのみが利用可能であれば、おそらくトークン化テーブルを生成するだけのツールで生活できるでしょう。
c - Lex / Yacc解析でエラーをキャッチするための経験則はありますか?
汎用言語をできるだけ早く(Lexで)解析しているときにエラーをキャッチする必要がありますか、それともより便利な場所で(Yaccで)より多くの情報を提供する必要がありますか?さまざまな言語がこの問題をどのように解決しますか?
c - Lex で単一行のコメントを認識できない
このプロセスでlexを学習しています.C言語のトークンを生成しています.1行のコメント「//」を認識しようとしていますが、除算演算子と競合しています.
しかし、例を実行して // を入力すると、2 つの除算演算子として認識されます。コードをどこで変更する必要がありますか。助言がありますか。
編集:
レックスコード:
以下は私が使用するヘッダーファイルです
以下は、実行中の入力です。
実行すると、コメントが消費され、除算演算子でさえ無視されます。しかし、p を入力するときに確認してください。上記の演算子は分類されますが、これは行うべきではありません。
f# - lex/yacc と fslex/fsyacc の違いは何ですか?
レクサーとパーサーを書きたいので、F# を学んでいます。私はこの種の処理の経験が少しありますが、F# と同様に適切に学習する必要があります。
F# の字句解析機能を学習する場合、lex と yacc を学習すれば十分ですか?
それとも、lex/yacc のコードが fslex と fsyacc で動作しないことを意味する違いはありますか?
regex - lex(flex)で生成されたプログラムが入力全体を解析しない
私は比較的単純なlex/flexファイルを持っており、それが適切にトークン化されていることを確認するために、flexのデバッグフラグを使用して実行しています。残念ながら、私は常に2つの問題のいずれかに遭遇しています-フレックスが生成するプログラムが2、3のトークンの後で静かに停止するか、文字と文字列を認識するために使用しているルールが呼び出されず、デフォルトのルール代わりに呼び出されます。
誰かが私を正しい方向に向けることができますか?フレックスファイルとサンプル入出力を添付しました。
編集:生成されたレクサーが特定のルール「cdr」の後に停止することがわかりました。これはより詳細ですが、はるかに混乱します。ショートした変更済みlexファイルを投稿しました。
サンプル入力:
生成されたパーサーを介して入力を実行することによる完全な出力:
何かご意見は?生成されたプログラムは、入力の半分の後であきらめています!(参考までに、ファイルの内容を生成されたプログラムにリダイレクトして入力を行っています)。
types - フレックスのデータ型の問題
私は問題があります。
私はflexでプログラムを書いており、このコードを使用しています:
このコードは私のデータ型用です。
次の行を評価したい: expresion SUM expresion ここで、SUM は評価の演算の合計で、たとえば 69 + 60 です。
これを書くと
次のエラーがあります
../src/buggy.y:350.37-38: $1 de `expression' no tiene tipo declarado
../src/buggy.y:351.28-29: $1 de `expression' no tiene tipo declarado
buggy.tab.c: 関数 'yyparse' 内:
buggy.tab.c:1646: 警告: 関数 'yylex' の暗黙の宣言</p>
../src/buggy.y: トップレベル:
lex.yy.c:1577: 警告: 'yyynput' が定義されていますが、使用されていません
lex.yy.c:1618: **警告: 'input' が定義されていますが、使用されていません
Leyendo fichero '../docs/prog1.bgy'.
何が問題ですか?
ありがとう!
さよなら!!
yacc - 複数のメンバーのタイプを取得する
私はYacc/Flexを使用してプログラムを作成しており、次のコードを使用しています(他のファイルのコードを混合しているため、まったく同じではありません)。
次に、このようなものを書くと:
barはデータ型INTEGERを正しく取得しますが、これがある場合:
1番目と2番目のメンバーのyylval.typeを個別に取得するにはどうすればよいですか?
どうもありがとう!