問題タブ [peg]
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 - 複数のパーサーを使用して行番号を保持することは可能ですか?
約 1 か月前に半関連の質問をし ました。複数のパスでの解析は PEG 文法では一般的ですか? いくつかのテキストの入力をパスで段階的に解析するために、いくつかの文法を書くことが問題ないかどうかを調べようとしていました。私のお気に入りのプロジェクトである音楽プログラミング言語 (MPL) パーサーのために、3 つの個別の文法を作成しました。
ソース ファイルの内容全体を取得し、コメントを削除します。
ソース ファイル (コメントを削除) を取得し、楽器ごとに分けます。これにより、楽器の名前/定義と、その楽器によって「演奏される」「音楽コード」のペアが作成されます。
実際に音楽コード (楽器ごとに 1 つのテキスト文字列) を解析し、楽器ごとに音楽の「イベント」の解析ツリーを返します。
私の以前の質問に答えたある人は、これは健全なアプローチであり、パーサー ジェネレーター ツールにこれを自動的に/単純に行う方法がない場合は、コメント削除パスを用意するのが合理的であると示しました。文法を統一する唯一の潜在的な理由は、パフォーマンス要件があるかどうかだけですが、私の場合はありません。
しかし、これについてさらに考えてみると、例外処理への影響について疑問に思っています。理想的には、パーサーが例外をスローしたときに、元のソース ファイルの正しい行番号を識別し、解析エラーを識別するエラー メッセージを表示するようにしたいと考えています。私が選んだパーサー生成ツールであるInstaparseには、次のような行番号と列番号を識別する素敵なエラー メッセージがあります。
問題は、これらのエラーがパスごとにスローされることです。ソース ファイルからコメントを削除するために使用している最初の文法がある場合、元の行番号は保持されず、次のパスに進みます。そうでないことを心から願っていますが、正しい行番号を維持する唯一の方法は、すべてを単一の非常に複雑な文法に統合することだと私には思えます。これを回避する方法はありますか?複数の連続した文法を記述し、元の入力からの行番号を保持するためのパターンはありますか?
python - スペイン語の文法で文字列テキストを num に解析する
文字列テキストのスペイン語の数字を数字に変換する Python プログラムを作成する必要があります。
入力:
希望する出力:
私はいくつかのコードを書きましたが、ただのパーサーである車輪を再発明していることに気付きました。そのため、語彙/文法パーサー モジュールを使用する必要があります。しかし、これまで語彙/文法パーサーを扱ったことはなく、最初に BNF または PEG 表記を記述する必要があります (どのパーサー モジュールを使用するかはまだ決めていません。見つけた最も単純なものを使用します)。
スペイン語の数字の文法は英語とはかなり違うので、私には難しいです。
私のアプローチ:
スペイン語を話す人への質問だと思います。
glob - ファイル パス ワイルドカード (グロブ) の BNF 文法定義
BFN ルールで記述された、広く拡張された方言 (このhttps://github.com/vmeurisse/wildmatch + globstar ** など) を探しています。
任意の形式または言語で。OMeta または PEG が最適です。
parsing - 特殊なケースの解析
私の理解が正しければ、構文解析によって一連のシンボルがツリーに変換されます。私の質問は、標準的な手順 (LR、LL、PEG、..?) を使用して次の 2 つの例を解析することは可能ですか、それとも特殊なパーサーを手動で作成する必要がありますか?
- Python ソース コード、つまり空白でインデントされたブロック
パーサーが先頭のスペースの数を追跡し、それらを中括弧に置き換えてブロックを区切るふりをどこかで読んだと思います。標準の解析手法が十分に強力ではないため、それが基本的に必要なのか、それともパフォーマンス上の理由からですか?
- PNG 画像形式。ブロックはヘッダーとブロック サイズで始まり、その後にブロックのコンテンツが続きます。
コンテンツにはヘッダーに似たバイトが含まれる可能性があるため、次の x バイトが「解析」されないこと、つまりスキップされることを「認識する」必要があります。これを PEG で表現するにはどうすればよいでしょうか。つまり、「閉じ括弧」はコンテンツの長さで表されます。
python - グラコでのルールの優先順位の問題
私は元々 Perl で構築したミニ言語をやり直しています ( github の Chessa# を参照) が、セマンティクスを適用するときに多くの問題に直面しています。
文法は次のとおりです。
私が直面している問題はd
、演算子と後続の英数字文字列の間に空白が存在しない場合、演算子が識別子ルールに引き込まれていることです。文法自体はLL(2)なのですが、どこが問題なのかわかりません。
たとえば、は識別子4d6
として解釈されているため、パーサーを停止します。起こるべきことは、 が演算子であると解釈されることです。LL パーサーでは、これが実際に当てはまります。4
d6
d6
4
d
6
d
考えられる解決策はd
、識別子の開始を禁止することですが、これにより、関数などのdrop
名前をそのように指定することが許可されなくなります。
python - リスト内の浮動小数点は、「利用可能なオプションがありません」というエラーでパーサーを停止させます
この文法を考えると:
およびこのセマンティクス オブジェクト:
...パーサーは、no available options
非整数要素 (フロートまたはリスト; 変数は問題ありません) を含むリストに遭遇すると、エラーで停止します。
例:
drop(4d6, 1)
[1.5, 2, 3]
興味深いことに、drop([1, 2, 4, 2], 1)
正しく動作し、 を出力します[2, 4, 2]
。
javascript - peg.js を使用した XML 単一ノードの解析
入力が与えられます<outer> Content <inner> Inner <single/> </inner> </outer>
。
<single>
一致する終了ノードを持つノードとともにノードを解析する文法をどのように記述しますか?
hereから取得した現在の文法は次のとおりです。
これは、終了ノードを持つノードでのみ機能します。
問題は Text ルールにあると思います。だから私はそれを変更して、次のような否定的な先読みを含めることを実験してきました:
しかし、それはまだ成功したものをもたらしていません。
何か案は?
lua - 再帰的な LPeg パターンの作成
通常の PEG (構文解析式文法) では、これは有効な文法です。
ただし、LPeg を使用してこれを記述しようとすると、そのルールの再帰的な性質が失敗します。
この単純な例では、再帰を使用しないようにルールを書き直すことができますが、書き直したくない既存の文法がいくつかあります。
LPeg で自己参照ルールを作成するにはどうすればよいですか?