問題タブ [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.

0 投票する
1 に答える
6251 参照

c - (シェル) レクサーを手で書く方法

私はシェル、小さな bash のようなシェルに取り組んでおり、スクリプトを作成する必要はありません (if while ...) lexer/parser (LL) を手動で作成する必要があります。

したがって、レクサーはコマンド ( char *cmd ) をリンクされたリスト ( t_list *list ) に変換します。そして、LL パーサーは、リンクされたリスト ( t_list *list ) を文法を使用して AST (バイナリ ツリーt_btree *root ) に変換します。

したがって、LL パーサーの作成方法は知っていますが、コマンドをトークン化する方法はわかりません。

例えば:ps | grep ls >> file ; make && ./a.out

=>'ps' '|' 'grep' 'ls' '>>' 'file' ';' ''make '&&' './a.out'

ありがとう。

(発電機は使いたくない)

0 投票する
5 に答える
4070 参照

javascript - Javascript を解析するとき、スラッシュの意味を決定するものは何ですか?

Javascript には、解析するのにトリッキーな文法があります。スラッシュは、除算演算子、正規表現リテラル、コメント イントロデューサー、または行コメント イントロデューサーなど、さまざまなことを意味します。最後の 2 つは簡単に区別できます。スラッシュの後に星印が続くと、複数行のコメントが始まります。スラッシュの後に別のスラッシュが続く場合、それは行コメントです。

しかし、除算と正規表現リテラルのあいまいさを解消するためのルールは私を逃れています。ECMAScript 標準では見つかりません。そこでは、字句文法は、スラッシュの意味に応じて、InputElementDiv と InputElementRegExp の 2 つの部分に明示的に分割されます。しかし、いつどれを使用するかについては何も説明されていません。

そしてもちろん、恐ろしいセミコロン挿入規則がすべてを複雑にしています。

答えのあるJavascriptを字句解析するための明確なコードの例はありますか?

0 投票する
4 に答える
2528 参照

javascript - 単純なもののための再帰降下パーサー?

JS にコンパイルされるテンプレート言語用のパーサーを作成しています (関連する場合)。私はいくつかの単純な正規表現から始めましたが、うまくいくように見えましたが、正規表現は非常に壊れやすいので、代わりにパーサーを書くことにしました。スタックをプッシュ/ポップすることで状態を記憶する単純なパーサーを作成することから始めましたが、再帰降下パーサーを手に入れるまで状況はエスカレートし続けました。

その後すぐに、以前のすべての解析方法のパフォーマンスを比較しました。再帰的降下パーサーは群を抜いて最も遅かったです。私は立ち往生しています:単純なことに再帰降下パーサーを使用する価値はありますか、それともショートカットを使用することは正当化されますか? 私は純粋な正規表現ルートに行きたいと思っています。これは非常に高速ですが (RD パーサーよりもほぼ 3 倍高速です)、非常にハックであり、ある程度保守できません。コンパイルされたテンプレートはキャッシュされるため、パフォーマンスはそれほど重要ではないと思いますが、再帰降下パーサーはすべてのタスクに適したツールですか? 私の質問は、より哲学的なものと見なすことができると思います.パフォーマンスのために保守性/柔軟性を犠牲にする価値はどの程度ありますか?

0 投票する
2 に答える
892 参照

antlr - ANTLRは次の文字に基づいてレクサールールを区別できますか?

テストファイルを解析するために、識別子が数字で始まることを許可したいと思います。

私のルールは:

ただし、このファイルの番号も一致させる必要があります。そのための私のルールは次のとおりです。

INTが一致することは決してないので、明らかにAntlrはこれを許可しません。

これを許可する方法はありますか?具体的には、INTEGERの後にスペースのないIDをIDとして照合し、その後にスペースが続く場合にのみINTトークンを作成したいと思います。

例えば:

0 投票する
3 に答える
4023 参照

antlr - デフォルトと非表示の両方のチャネルから読み取る Antlr パーサー ルールを取得するにはどうすればよいですか

私は隠しチャネルへの通常の空白分離を使用していますが、後で処理するために空白を含めたいルールが 1 つありますが、見つかった例には非常に奇妙な手動コーディングが必要です。

最初から空白を配置するオプションのように、複数のチャネルから読み取る簡単なオプションはありませんか。

元。これは WhiteSpace lexer ルールです

そして、これは空白を含めたい私のルールです

基本的に、他のルールに一致しないコンテンツをキャプチャして別のパターンで処理するのは、キャッチ オール ルールであるため、元のストリームが必要です。

構文の例を期待していました{$channel==DEFAULT || $channel==HIDDEN}が、見つかりません。

私のターゲットは C# ですが、必要に応じて Java の例を書き直すこともできます。

0 投票する
2 に答える
734 参照

c# - C# でのカスタム データ トークンの解析と値への置換

レコードから約 10 個のデータがあり、このデータが返される文字列のレイアウトを定義できるようにしたいと考えています。いくつかの部分を除外するオプションがあります。私の考えは、列挙型を使用してトークン/フィールドに整数値を与え、次のような形式{0}{1}{2}{3} または複雑なものにすること{4} - {3}{1} [{8}]でした。トークンの意味は、データベース内のフィールドに関連しています。たとえば、支払いに関連するトークンにこの列挙型があります。

アカウント マスクは VXXXXX1234 のような文字列で、V はビザ用、1234 はカードの下 4 桁です。クライアントは V が必要な場合もあれば、最初の数字が必要な場合もあります (カードの種類を最初の数字に変換するのは簡単です)。

私の目標は、フォーマット文字列のトークンを使用して文字列を生成するために再利用可能なものを作成し、トークン内の数字に関連付けられたデータを使用してデータのインプレース置換を行うことです。

したがって、フォーマットを定義したい場合は、上記のマスクと私の列挙型を使用した例について9{2}{1}{4:[0:0000000000]}

商品番号が678934の場合

これは 9412340000678934 に変換され、トークン 4 の内部部分がString.Formatその値の a の定義になります。また、トークンの周囲に配置されたデータは無視され、所定の位置に保持されます。

私の問題は、文字列の操作とベストプラクティスです。正規表現をその場で作成しようとすると、コストがかかる可能性があると言われています。CS専攻として、「正しい」(どんなに複雑な) 解決策は、自分のトークン用のレクサー/パーサーを作成することだと感じています。私は C# でレクサー/パースを書いた経験がないので、その周りのベスト プラクティスがわかりません。ここでは、効率的で簡単に調整できるシステムに関するガイダンスを探しています。

0 投票する
5 に答える
629 参照

parsing - 「lexer」という単語は「parser」という単語の同義語ですか?

タイトルは質問です:「lexer」と「parser」という単語は同義語ですか、それとも違いますか?ウィキペディアでは同じ意味で使われているようですが、英語は私の母国語ではないのでわかりません。

0 投票する
1 に答える
268 参照

parsing - プログラミング言語の内部の仕組みを理解する

C のようなプログラミング言語の内部動作を学習するには、どこから始めるのがよいでしょうか?
パーサー/レクサーがどのように機能するかを学習しますか?

0 投票する
1 に答える
12084 参照

parsing - Java CUP による解析木生成

JFlex で CUP を使用して、式の構文を検証しています。基本的な機能は動作しています。式が有効かどうかを判断できます。

次のステップは、「1 を足す」などの単純な算術演算を実装することです。たとえば、式が「1 + a」の場合、結果は「2 + a」になるはずです。これを行うには、構文解析ツリーにアクセスする必要があります。単に数値用語を識別するだけでは不十分なためです。「(1 + a) * b」に 1 を加算した結果は、「(1 + a) * b + 1」になるはずです。 、「(2 + a) * b」ではありません。

解析ツリーを生成する CUP の例はありますか? そこから取れると思います。

追加のボーナスとして、JFlex を使用して式のすべてのトークンのリストを取得する方法はありますか? 典型的なユースケースのように思えますが、それを行う方法がわかりません。

編集:スタックオーバーフローに関する有望な手がかりが見つかりました: パーサーから抽象ツリーの問題を作成する

CUP と AST の議論:

http://pages.cs.wisc.edu/~fischer/cs536.s08/lectures/Lecture16.4up.pdf

具体的には、この段落:

パーサーによって返された Symbol は、文法の開始記号に関連付けられており、ソース プログラム全体の AST が含まれています。

これは役に立ちません。Symbol クラスにその子へのナビゲーション ポインタがない場合、Symbolインスタンスを指定してツリーをトラバースする方法は? つまり、ツリー ノードのように見えたり、動作したりしません。

0 投票する
1 に答える
298 参照

f# - fslex/Lexing.LexBufferを使用して先読みを実行する方法はありますか

私はfslexを使用しており、トークナイザールールの1つで次の文字を探す必要があります。これにより、トークンの消費を継続するか、停止して巻き戻し、前のルールで消費させるかを決定できます。

私はそのソースコードをチェックするのにいくらか費やしました、そして唯一の方法はいくつかの内部メソッドを公開するバージョンをコンパイルすることであるように見えます。たぶんここの誰かがより良い解決策を持っていますか?