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

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

c++ - 構文解析式文法の左因数分解

次の式を許可する言語の文法を書こうとしています。

  1. 形式の関数呼び出しf args(注: 括弧なし!)
  2. フォームの追加 (およびより複雑な式ですが、ここでは重要ではありません)a + b

例えば:

文法は明確です (すべての式は正確に 1 つの方法で解析できます) が、両方のプロダクションが同じトークンで始まる可能性があるため、この文法を PEG として記述する方法がわかりませんid。これは私の間違った PEG です。有効にするにはどうすれば書き直せますか?

ここで、この文法が入力 "<code>a + b" を解析しようとすると、"<code>a" を引数なしの関数呼び出しとして解析し、"<code>+ b" でチョークします。

誰かがそれで遊びたい場合に備えて、文法の C++ / Boost.Spirit.Qi 実装をアップロードしました。


(単項演算と加算を明確にすることに注意してくださいunary。負の数を引数として関数を呼び出すには、括弧を指定する必要があります。たとえば、f (-1).)

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

parser-generator - PEGと空白/コメント

私はANTLRでパーサーを作成した経験があり、(自己教育のために:))そのうちの1つをPEG(Parsing Expression Grammar)に移植しようとしています。

私がそのアイデアを感じ取ろうとしているとき、私が何かを逃したと感じる程度に、1つのことが厄介だと思います。それは空白の扱い方です。

ANTLRでは、空白とコメントを処理する通常の方法は、トークンを非表示のチャネルに配置することでしたが、PEG文法では、トークン化の手順はありません。コメントがほとんどどこでも許可されるCやJavaなどの言語を考えると、コメントをすぐに「非表示」にしたいのですが、コメントには意味的な意味がある場合があるため(たとえば、コードド​​キュメント、クラス図などを生成する場合)、それらを破棄したいだけではありません。

それで、これに対処する方法はありますか?

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

ruby - オプションのコンテンツを解析する PEG 文法

Treetopで両方をサポートする構文を記述する方法を教えてください。

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

javascript - BBCode の解析に PEG パーサーを使用: pegjs または ... 何?

テキストエリアの変更イベントに応答する bbcode -> html コンバーターがあります。現在、これは一連の正規表現を使用して行われており、多くの病的なケースがあります。私はいつもこの文法の鉛筆を削りたいと思っていましたが、ヤクの毛を剃りたいとは思いませんでした. しかし...最近、PEGパーサー生成のかなり完全な実装のように見えるpegjsに気付きました。文法の大部分を指定しましたが、これが本格的なパーサーの適切な使用法であるかどうか疑問に思っています。

私の具体的な質問は次のとおりです。

  1. 私のアプリケーションは、できることを HTML に変換し、残りを生のテキストとして残すことに依存しているため、構文エラーで失敗する可能性のあるパーサーを使用して bbcode を実装することは理にかなっていますか? 例:[url=/foo/bar]click me![/url]終了タグの終了ブラケットが入力されると、確実に成功することが期待されます。しかし、その間にユーザーは何を見るでしょうか? 正規表現を使用すると、一致しないものを無視して、プレビュー用の通常のテキストとして扱うことができます。正式な文法では、解析ツリーから HTML を作成することに依存しているため、これが可能かどうかわかりません。解析に失敗するのは何ですか?

  2. どこで変換を行う必要があるのか​​ わかりません。正式な lex/yacc ベースのパーサーでは、ノード タイプを示すヘッダー ファイルとシンボルを使用します。pegjs では、ノード テキストを含むネストされた配列を取得します。pegjsで生成されたパーサーのアクションとして翻訳したコードを出力できるのですが、パーサーとエミッターを組み合わせるのがコード臭そうです。ただし、 を呼び出すとPEG.parse.parse()、次のような結果が返されます。

p>

次のような文法が与えられます:

もちろん、私は文法を省略していますが、あなたはその考えを理解しています. したがって、配列の配列には、所有しているノードの種類を示すコンテキスト情報がなく、パーサーが既にこれを行っていると思っていても、文字列の比較を再度行う必要があります。コールバックを定義し、アクションを使用して解析中にそれらを実行することは可能だと思いますが、それを行う方法について Web 上で入手できる情報はほとんどありません。

私は間違った木を吠えていますか?正規表現スキャンに戻り、解析を忘れるべきですか?

ありがとう

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

parsing - パーサーのパフォーマンス: PEG vs LALR(1) または LL(k)

一般に、最適化された PEG パーサーは、最適化された LALR(1) または LL(k) パーサーよりも高速ではないという主張を見てきました。(もちろん、解析のパフォーマンスは特定の文法に依存します。)

PEGパーサーに特定の制限があるかどうかを知りたい.

特に、パーサー ジェネレーターに興味がありますが、特定のケースでパフォーマンスを向上させるために出力を微調整できると想定しています。また、パーサーは最適化されており、パフォーマンスを向上させるために必要な場合は、特定の文法を少し調整できると想定しています。

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

javascript - PEG.jsを使用してインデントレベルを解析します

PythonスタイルのインデントのPEGと基本的に同じ質問がありますが、この回答に関してもう少し方向性を知りたいと思います。

答えは、行の間に「インデント」と「DEDENT」を含む入力の各行である文字列の配列を正常に生成します。彼はトークン化にPEG.jsをほとんど使用しているようですが、実際の解析は行われていません。

では、実際の解析を行うために彼の例をどのように拡張できますか?

例として、この文法を変更するにはどうすればよいですか。

ブロックを描くために中括弧の代わりにインデントを使用し、それでも同じ出力を取得するには?

http://pegjs.majda.cz/onlineを使用して、次の入力でその文法をテストしますa{bcd{zyx{}}}:)

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

parsing - Parsing Expressionive Grammar (PEG.js) での予約語の解析

同様の質問著者のウェブサイトから、次のような解決策が得られます。

このソリューションは、この「test_var」のような識別子を解析できません。

この例では、文法 !ReservedWord は、"test" または "abc" で始まるすべての変数を除外します。

前もって感謝します。

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

javascript - どちらが速いですか:PEGまたはGLR?

私はC/ALプログラミング言語用のある種のlintツールを作成しようとしています。したがって、基本的には、ソースコードに対して構文と字句解析を実行する必要があります。パーサーを最初から作成することを計画しましたが、これらのパーサーを自動的に生成するのに役立つツールがたくさんあることに気付きました。

20メガバイトのコードを1つのピースでチェックするのが通常のシナリオであり、そのツールをカスタムルールで拡張できるようにする必要があるため、パフォーマンスが必要です。そこで、JavaScriptを使用することにしました。

これまでのところ、 JisonPEG.jsを使用できる2つのジェネレーターを見つけました。

それらのどれが私にもっと解析パフォーマンスを与えますか?たぶんライブラリを比較するのではなく、アルゴリズムを比較するのでしょうか?

どちらが私のニーズに適していますか(汎用プログラミング言語の解析)?

更新: 私は同様のQ&Aを見つけました:

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

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

だから、私の質問は:誰かが私の文法の何が悪いのかを見つけることができますか?私はすべてアイデアが足りず、数日間それを見つめています。恥ずかしいほどシンプルなものだと思いますが、見えません!

前もって感謝します。

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

ruby - バックトラックせずにツリートップで左再帰を回避するにはどうすればよいですか?

作業中のこの単純な式パーサーで左再帰を回避するのに問題があります。基本的に、方程式'fxy'を2つの式'fx'と'(fx)y'(暗黙の括弧付き)に解析したいと思います。左再帰とバックトラックを回避しながら、これを行うにはどうすればよいですか?中間ステップが必要ですか?