問題タブ [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.
c++ - 構文解析式文法の左因数分解
次の式を許可する言語の文法を書こうとしています。
- 形式の関数呼び出し
f args
(注: 括弧なし!) - フォームの追加 (およびより複雑な式ですが、ここでは重要ではありません)
a + b
例えば:
文法は明確です (すべての式は正確に 1 つの方法で解析できます) が、両方のプロダクションが同じトークンで始まる可能性があるため、この文法を PEG として記述する方法がわかりませんid
。これは私の間違った PEG です。有効にするにはどうすれば書き直せますか?
ここで、この文法が入力 "<code>a + b" を解析しようとすると、"<code>a" を引数なしの関数呼び出しとして解析し、"<code>+ b" でチョークします。
誰かがそれで遊びたい場合に備えて、文法の C++ / Boost.Spirit.Qi 実装をアップロードしました。
(単項演算と加算を明確にすることに注意してくださいunary
。負の数を引数として関数を呼び出すには、括弧を指定する必要があります。たとえば、f (-1)
.)
parser-generator - PEGと空白/コメント
私はANTLRでパーサーを作成した経験があり、(自己教育のために:))そのうちの1つをPEG(Parsing Expression Grammar)に移植しようとしています。
私がそのアイデアを感じ取ろうとしているとき、私が何かを逃したと感じる程度に、1つのことが厄介だと思います。それは空白の扱い方です。
ANTLRでは、空白とコメントを処理する通常の方法は、トークンを非表示のチャネルに配置することでしたが、PEG文法では、トークン化の手順はありません。コメントがほとんどどこでも許可されるCやJavaなどの言語を考えると、コメントをすぐに「非表示」にしたいのですが、コメントには意味的な意味がある場合があるため(たとえば、コードドキュメント、クラス図などを生成する場合)、それらを破棄したいだけではありません。
それで、これに対処する方法はありますか?
ruby - オプションのコンテンツを解析する PEG 文法
Treetopで両方をサポートする構文を記述する方法を教えてください。
と
javascript - BBCode の解析に PEG パーサーを使用: pegjs または ... 何?
テキストエリアの変更イベントに応答する bbcode -> html コンバーターがあります。現在、これは一連の正規表現を使用して行われており、多くの病的なケースがあります。私はいつもこの文法の鉛筆を削りたいと思っていましたが、ヤクの毛を剃りたいとは思いませんでした. しかし...最近、PEGパーサー生成のかなり完全な実装のように見えるpegjsに気付きました。文法の大部分を指定しましたが、これが本格的なパーサーの適切な使用法であるかどうか疑問に思っています。
私の具体的な質問は次のとおりです。
私のアプリケーションは、できることを HTML に変換し、残りを生のテキストとして残すことに依存しているため、構文エラーで失敗する可能性のあるパーサーを使用して bbcode を実装することは理にかなっていますか? 例:
[url=/foo/bar]click me![/url]
終了タグの終了ブラケットが入力されると、確実に成功することが期待されます。しかし、その間にユーザーは何を見るでしょうか? 正規表現を使用すると、一致しないものを無視して、プレビュー用の通常のテキストとして扱うことができます。正式な文法では、解析ツリーから HTML を作成することに依存しているため、これが可能かどうかわかりません。解析に失敗するのは何ですか?どこで変換を行う必要があるのか わかりません。正式な lex/yacc ベースのパーサーでは、ノード タイプを示すヘッダー ファイルとシンボルを使用します。pegjs では、ノード テキストを含むネストされた配列を取得します。pegjsで生成されたパーサーのアクションとして翻訳したコードを出力できるのですが、パーサーとエミッターを組み合わせるのがコード臭そうです。ただし、 を呼び出すと
PEG.parse.parse()
、次のような結果が返されます。
次のような文法が与えられます:
もちろん、私は文法を省略していますが、あなたはその考えを理解しています. したがって、配列の配列には、所有しているノードの種類を示すコンテキスト情報がなく、パーサーが既にこれを行っていると思っていても、文字列の比較を再度行う必要があります。コールバックを定義し、アクションを使用して解析中にそれらを実行することは可能だと思いますが、それを行う方法について Web 上で入手できる情報はほとんどありません。
私は間違った木を吠えていますか?正規表現スキャンに戻り、解析を忘れるべきですか?
ありがとう
parsing - パーサーのパフォーマンス: PEG vs LALR(1) または LL(k)
一般に、最適化された PEG パーサーは、最適化された LALR(1) または LL(k) パーサーよりも高速ではないという主張を見てきました。(もちろん、解析のパフォーマンスは特定の文法に依存します。)
PEGパーサーに特定の制限があるかどうかを知りたい.
特に、パーサー ジェネレーターに興味がありますが、特定のケースでパフォーマンスを向上させるために出力を微調整できると想定しています。また、パーサーは最適化されており、パフォーマンスを向上させるために必要な場合は、特定の文法を少し調整できると想定しています。
javascript - PEG.jsを使用してインデントレベルを解析します
PythonスタイルのインデントのPEGと基本的に同じ質問がありますが、この回答に関してもう少し方向性を知りたいと思います。
答えは、行の間に「インデント」と「DEDENT」を含む入力の各行である文字列の配列を正常に生成します。彼はトークン化にPEG.jsをほとんど使用しているようですが、実際の解析は行われていません。
では、実際の解析を行うために彼の例をどのように拡張できますか?
例として、この文法を変更するにはどうすればよいですか。
ブロックを描くために中括弧の代わりにインデントを使用し、それでも同じ出力を取得するには?
(http://pegjs.majda.cz/onlineを使用して、次の入力でその文法をテストしますa{bcd{zyx{}}}
:)
javascript - どちらが速いですか:PEGまたはGLR?
私はC/ALプログラミング言語用のある種のlint
ツールを作成しようとしています。したがって、基本的には、ソースコードに対して構文と字句解析を実行する必要があります。パーサーを最初から作成することを計画しましたが、これらのパーサーを自動的に生成するのに役立つツールがたくさんあることに気付きました。
20メガバイトのコードを1つのピースでチェックするのが通常のシナリオであり、そのツールをカスタムルールで拡張できるようにする必要があるため、パフォーマンスが必要です。そこで、JavaScriptを使用することにしました。
これまでのところ、 JisonとPEG.jsを使用できる2つのジェネレーターを見つけました。
それらのどれが私にもっと解析パフォーマンスを与えますか?たぶんライブラリを比較するのではなく、アルゴリズムを比較するのでしょうか?
どちらが私のニーズに適していますか(汎用プログラミング言語の解析)?
更新: 私は同様のQ&Aを見つけました:
parsing - アモトエンとの構文解析
Clojureとamotoenを使用して、ドラムループを記述するための単純な言語を解析する文法を作成しようとしています。言語は次のようになります:– </ p>
文法を次のように定義しました:– </ p>
pegasus
サンプルファイルの各部分を個別に呼び出すと、正しく解析されます。例:– </ p>
ただし、電話をかけると(pprint (a/pegasus :Document g (a/wrap-string (slurp "sample.orc"))))
、取得できるのは。だけですnil
。同様に、に(a/wrap-string (slurp "sample.orc"))
含まれるテキストを含む文字列に置き換える場合sample.orc
。
だから、私の質問は:誰かが私の文法の何が悪いのかを見つけることができますか?私はすべてアイデアが足りず、数日間それを見つめています。恥ずかしいほどシンプルなものだと思いますが、見えません!
前もって感謝します。
ruby - バックトラックせずにツリートップで左再帰を回避するにはどうすればよいですか?
作業中のこの単純な式パーサーで左再帰を回避するのに問題があります。基本的に、方程式'fxy'を2つの式'fx'と'(fx)y'(暗黙の括弧付き)に解析したいと思います。左再帰とバックトラックを回避しながら、これを行うにはどうすればよいですか?中間ステップが必要ですか?