問題タブ [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.
scheme - Racket lexer ジェネレーターの使用方法を示す例は?
私は最近、Racket で遊んでいます。現在、スクリプト言語のサブセット用のレクサーを実装しています...Racket でレクサー ジェネレーターを使用する方法を示す例がもっとあるのではないかと考えています。
ドキュメントの電卓の例は理解できますが、単純すぎてすべての機能を表示できません...各文字の位置を参照する方法に特に興味があります....
php - XML ベースのテンプレート エンジンと Smarty lexer の比較
Smarty 3 とその新しいレクサー、およびそれがテンプレート デザイナーとしてどれだけ多くの機能を提供するかについては多くの興奮がありましたが、実際にそのまま棚に置かれたとき、その遅さに本当にがっかりしました。テンプレートを最初からコンパイルするのに Smarty 3 では 1 秒以上かかりましたが、Smarty 2 では同じテンプレートを約 0.5 秒かかりました。良くない。
しかし、DOMDocument、SimpleXML などのモジュールが既に利用可能な PHP で、本格的な言語パーサーを実装する必要があるのはなぜでしょうか?
XML 拡張や DOMDocument に基づく PHP 用のテンプレート エンジンはありますか? もしそうなら、パフォーマンスはどのようなものですか?そうでない場合、誰かがそれを書き込もうとしましたか?
私が予見できる欠点の 1 つは、XHTML や RSS などの XML ベースのフォーマットでしか実際に役に立たないことです。他の出力 (非 XML HTML、プレーン テキスト、CSS など) を生成する場合、かなり問題になる可能性がありますが、CDATA ブロックで回避できると確信しています。テンプレートの解析に XML/DOM を使用することで、私が考慮していない他の影響はありますか?
c# - C#を使用して次の文字列操作を実行する方法を誰でも推奨できますか
文字列があるとします:
「私のイベントは 1976 年にニューヨークのブロードウェイで起こった」
そのような文字列はたくさんありますが、場所と日付は異なります。例えば:
「私の出来事は 1998 年にボストンの 2 番街で起こった」 「私の出来事は 1968 年にウォシュテノーのアナーバーで起こった」
したがって、一般的な形式は次のとおりです。「私のイベントは X で Y で Z で発生しました」
文字列を解析して X、Y、Z を抽出したい
Split を使用し、"in"、"on" という標識語を使用して必要なトークンを区切ることもできますが、これは扱いにくいようです。しかし、grammatica のような完全なパーサー/レクサーを使用するのは、かなり重いようです。
推薦はありがたく受け入れます。
C# 用の「単純な」パーサー lexer はありますか?
parsing - 文法のあいまいさを解決する
Delphi の dfm ファイル用のパーサーを作成しています。レクサーは次のようになります。
バイソンの文法は次のようになります
この文法の問題は、バイナリ データの解析中に発生します。dfm のファイル内のバイナリ データは、1 行あたり 80 文字を超えることのない 16 進文字のシーケンスに他なりません。その例は次のとおりです。
ご覧のとおり、この要素にはマーカーがないため、文字列が他の要素と衝突します。上記の例では、最初の行で適切な token が返されますtkHexValue
。ただし、2 番目はtkInteger
トークンを返し、3 番目はトークンを返しtkIdentifier
ます。そのため、バイナリ データはトークンのみで構成されているため、構文解析が行われると構文エラーで失敗します。tkHexValue
私の最初の回避策は、整数に最大長を要求することでした (これは、バイナリ データの最後の行を除くすべてで役立ちました)。そして2番目はtkHexValue
トークンを上に移動することでしたが、これは、次のtkIdentifier
ような識別子がなくなることを意味しますF0
この文法を修正する方法があるかどうか疑問に思っていましたか?
parsing - レクサーと多くのパーサーの組み合わせ
レクサーとパーサーの典型的な構成を知っています。レクサーはソースコードを読み取り、トークンを生成します。トークンはパーサーに送信され、パーサーはそれらを文法生成の終端記号として使用します。典型的な再帰下降パーサーでは、開始非終端記号を表すトップレベル関数を呼び出すことから始めます。この関数は他の関数を呼び出し、レクサーからトークンごとに読み取ります。
しかし、同じレクサーの上に2つの異なるパーサーが必要な場合はどうなりますか?
つまり、レクサーでの不要な重複作業を避けるために、同じソースを複数回読み取ることは望ましくないため、つまり、複数のパスを許可しないため、両方とも同じ場所から読み取ることになります。順番に次のトークンが生成されたときに、両方のパーサーが同時にそれを消費するようにしたいだけです。
ただし、これらのパーサーの1つで呼び出すことができる最上位関数は1つだけです。両方を同時に呼び出すことはできません:/
これらのパーサーをある種のステップモードで実行する方法はありますか?つまり、新しいトークンを取得したら、それを両方のパーサーに次々に渡したいのですが、その1つのトークンだけ進めて、内部状態とデータ構造を可能な限り更新し、すぐに返します。別のトークンを待つ。
この種の構成はこれまで見たことがありません。そのようにパーサーを構築することは可能ですか?この種のパーサーをコードでどのように構造化できるかについての資料はありますか?名前はありますか?
編集1: パーサジェネレータツールを使用したくありませんが、この種のものが内部でどのように機能するかを学びたいので、自分でコードを記述します。
java - Java パーサー/レクサーに指示を与える
Javaコードレベルからパーサーとレキサーに直接指示を与える方法はありますか? そうでない場合、どうすればこれを行うことができますか?
問題は、パーサーに変数を評価させ、バックアップしてから、その変数の値をオブジェクト名として割り当てたいということです。このような:
パーサーは読み取ります--> OK、s は「テキスト」と評価されます... パーサーはバックトラックしますが、「テキスト」をメモリに保持し、「テキスト」を SomeClass の新しいインスタンスの名前として割り当てます。これにより、次のことが可能になります。
SomeClass の任意の数のオブジェクトをインスタンス化する必要があるため、これを行う必要があります。それぞれに一意の名前を付ける必要があり、次のようにするのが理想的です。
これが理にかなっていることを願っています...
parsing - レクサーとパーサーの境界線はどこに引くべきですか?
私は教育目的で IMAP プロトコル用のレクサーを作成していますが、レクサーとパーサーの境界線をどこに引くべきか悩んでいます。IMAP サーバーの応答の例を次に示します。
この応答は、次のような正式な構文で定義されます。
これらは文字列リテラル (別名「端末」トークン) として指定されているため、次のように、レクサーがそれぞれに対して一意のトークンを発行する方が正しいでしょう。
または、次のようなものを発行するのも同じくらい正しいでしょうか:
私の混乱は、前者の方法がレクサーを過度に複雑にする可能性があること\Answered
です.2つの異なるコンテキストで2つの意味がある場合、レクサーは正しいトークンを発行しません。不自然な例として (電子メール アドレスが引用符で囲まれているため、このような状況は発生しません)、レクサーは \Answered@googlemail.com のような電子メール アドレスをどのように処理しますか? それとも、そのようなあいまいさが生じないように設計された正式な構文ですか?
c++ - Perl でコンパイラーの一部 (c++ で作成) を作成する
私はコンパイラーとプログラミング言語についてもっと学ぼうとしていますが、残念ながら私の大学はコンパイラーについてのコースを提供していないので、自分でやらなければなりません (インターネットに感謝します)。
現時点では、自分の言語のレクサーを理解し、実装しようとしていますが、正規表現が必要です。
私は perl regex を非常に迅速にスクリプト化することに慣れており、C++ lexer に Perl を埋め込むことができると考えました。質問は次のとおりです。
- 重いオーバーヘッドが発生しますか?
- BOOST (または他の C++ ライブラリの適切な gor 正規表現) と和解しようとする必要がありますか?
これを読んでくれてありがとう:)
java - Java ソース コードに関する情報を取得するための javax.lang.model または ANTLR JavaParser の使用例/チュートリアル
単純な Java ロジックへの自動フローチャートのような視覚化を作成したいと思います。そのためには、Java ソース コードを解析する必要があります。Java 6 のANTLRとjavax.lang.modelの 2 つの候補があります。どちらも簡単ではありません。
私が達成したいことに少しでも近い実用的な例をまだ見つけていません。
簡単な変数宣言、代入、フロー (if、for、switch、boolean 条件など) を見つけたい
これらのいずれかの簡単な例またはチュートリアルはありますか? ANTLRの例はほとんど見つかりませんでした(重要な「宿題」なしでそのまま使用できるものはありません)。javax.lang.modelの例はまったくありません
compiler-construction - 簡単なコンパイラーのプログラミング
私は単純な言語のコンパイラを書いています。
ファイルを取得してトークンを に出力するレクサー/トークナイザーを作成しましたstdout
。
構文解析を行いたいのですが、トークンを入力として受け取るためにレクサーを変更する方法がわかりません。
- リンクされたリストは、大きなファイルに対して非常に非効率的です (約 80MB のソース ファイルは約 1.3GB の RAM を必要とします)。
- レクサーを変更して、呼び出されるたびに次のトークンを提供することもできます (アイデアは Dragon Book から取られました) が、プロセスのどこかで前のトークンに戻って読み取らなければならない場合、どうすればよいかわかりません。
これらのことを行う正しい方法は何ですか?