問題タブ [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 投票する
10 に答える
1635 参照

ruby - 各行で複数 (15 以上) の正規表現に対してテキストの本文を解析する最良の方法は何ですか?

スキャンしなければならないテキストの本文があり、各行には少なくとも 2 つ、場合によっては 4 つの情報部分が含まれています。問題は、各行が 15 ~ 20 の異なるアクションのうちの 1 つになる可能性があることです。

ruby では、現在のコードは次のようになります。

これは明らかに「問題」です。すべての正規表現を 1 つに結合することで (C++ で 50% のマージンで) 高速化することができましたが、それでもまだ必要な速度ではありません。何千ものこれらのファイルを高速に解析する必要があります。

現在、正規表現と照合していますが、これは耐えられないほど遅いです。私はルビーから始めて、速度が向上することを期待して C++ に飛び乗りましたが、それは実現していません。

PEG と文法ベースの解析について何気なく読んだことがありますが、実装するのはやや難しいようです。これは私が向かうべき方向ですか、それとも別のルートがありますか?

基本的に、私はポーカー ハンドの履歴を解析しています。ハンド履歴の各行には、通常、収集する必要がある 2 ~ 3 ビットの情報が含まれています: プレイヤーが誰で、いくらの金額で、アクションに必要なカードは何かなど..

解析が必要なサンプル テキスト:

この情報を収集した後、各アクションは xml ノードに変換されます。

今のところ、これの Ruby 実装は私の C++ 実装よりもはるかに高速ですが、それは問題です。私は4〜5年以上Cコードを書いていないからです

更新: ここにすべてのコードを投稿したくはありませんが、これまでのところ、私の手/秒は次のようになっています:

私は現在、さらに先に進むことができるかどうかを確認するために antlr をテストしていますが、現時点では、spirit の結果に非常に満足しています。

関連する質問:複数の正規表現に対して 1 つの文字列を効率的にクエリする。

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

parser-generator - PEG文法とパーサージェネレーターの制限?

私はYARDをとても楽しんでいました:

http://www.ootl.org/yard/

http://code.google.com/p/yardparser/

http://www.codeproject.com/KB/recipes/yard-tokenizer.aspx

完全に機能する電卓を構築することができました。PHPパーサーを実行するためにYARDを評価しています。PEG文法とパーサージェネレーターの制限について親切にアドバイスしてください。どうもありがとうございました!

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

javascript - PEG.js を使用した簡単な解析の質問

単純な文法をPEG.js プレイグラウンドに入力することで、PEG に頭を悩ませようとしています。

例 1:

  • 入力:"abcdef1234567ghijklmn8901opqrs"
  • 望ましい出力:["abcdef", "1234567", "ghijklmn", "8901", "opqrs"]

  • 実際の出力:["abcdef", ["1234567", ["ghijklmn", ["8901", ["opqrs", ""]]]]]

この例はほとんど機能しますが、結果の配列を 100 万レベルにネストしないように PEG.js を取得できますか? concat()どこかの代わりに使うのがコツjoin()だと思いますが、場所がわかりません。

例 2:

例 1 と同じ問題とコードですが、Characters ルールを次のように変更すると、同じ結果が得られると予想されます。

結果の出力は次のとおりです。

これらの空の一致がすべて取得されるのはなぜですか?

例 3:

最後の質問。これはまったく機能しません。どうすればそれを機能させることができますか?ボーナス ポイントとして、効率性に関するヒントはありますか? たとえば、可能であれば再帰を避けるべきですか?

優れた PEG チュートリアルへのリンクもいただければ幸いです。( http://www.codeproject.com/KB/recipes/grammar_support_1.aspx )を読みましたが、ご覧のとおり、さらに助けが必要です ...

  • 入力: 'abcdefghijklmnop"qrstuvwxyz"abcdefg'
  • 望ましい出力:["abcdefghijklmnop", "qrstuvwxyz", "abcdefg"]
  • 実際の出力:"abcdefghijklmnop\"qrstuvwxyz\"abcdefg"
0 投票する
2 に答える
999 参照

regex - テキストエディタの文法を定義する最良の方法は何ですか?

私はマゾヒスティックに Mac 用のオープンソースのテキスト エディターを作成しており、最終的にシンタックス ハイライトを追加したいところまで来ました。私は過去数日間、さまざまな解決策を行ったり来たりしてきましたが、最終的に、この質問をより多くの聴衆に公開することにしました。

ここに私が見るオプションがあります:

  • 基本的に一連の正規表現パターン マッチングを使用して言語を定義します (TextMate が言語を定義する方法と同様)。
  • BNF や PEG などの正式な文法で言語を定義する

正規表現パターン マッチングを使用することは、正式な文法とほぼ同じくらい言語を正式に表すことができないため、理想的とは言えません。ただし、形式的でない言語の中には、BNF に適合するのに苦労するものもあります (つまり、Markdown - ただし、優れたPEG 実装があることは知っています)。

ライブ構文強調表示のパフォーマンスのトレードオフは何ですか? 幅広い言語に対する柔軟性はどうですか?

私が BNF ルートに行くとすれば、Todd Ditchendorf が素晴らしいParseKitフレームワークを作成しました。PEGに似たものを知っている人はいますか?

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

parsing - Python スタイルのインデント用の PEG

Python/Haskell/CoffeScript スタイルのインデントを処理できる次のパーサー ジェネレーター ( PEG.jsCitrusTreetop ) のいずれかで、解析式文法をどのように記述しますか。

まだ存在しないプログラミング言語の例:



更新: 上記の例のインタープリターを作成しようとしないでください。私はインデントの問題にのみ興味があります。別の例として、次の構文解析が考えられます。

0 投票する
0 に答える
1086 参照

parsing - 左再帰を処理できる PEG パーサーはありますか?

ええと、文法を書き直して左再帰をなくすことができることは知っています。しかし、これは非常に退屈なプロセスであり、正しい結合性を維持することは非常に重要な場合があります。左再帰を使用して適切に文法を処理できるパーサーはありますか?

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

ruby - Treetop Ruby パーサー - Ordered Choice を解析できませんでした

以下のように、Treetop を使用して文字列と数値を解析するための簡単な文法を定義しました。

ルビー:

パーサーが文字列ノードを返すことを期待していますが、パーサーが入力を理解できなかったようです。任意のアイデアをいただければ幸いです。

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

c++ - Windows OS 上の PEG パーサー ライブラリ

Windows 用の構文解析式文法 (PEG) C++ ライブラリはありますか? MS Visual Studio で pegc/legc, pegc をコンパイルしようとしましたが無駄でした。:(

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

regex - PEG と CFG の違いは何ですか?

このウィキペディアのページから:

文脈自由文法と構文解析式文法の根本的な違いは、PEG の選択演算子が順序付けられていることです。最初の選択肢が成功した場合、2 番目の選択肢は無視されます。したがって、文脈自由文法や正規表現のような順序付けられていない選択とは異なり、順序付けられた選択は交換可能ではありません。順序付き選択は、一部のロジック プログラミング言語で使用できるソフト カット演算子に似ています。

PEG の選択演算子がマッチングを短絡させるのはなぜですか? (メモ化による)メモリ使用量を最小限に抑えるためですか?

正規表現での選択演算子が何であるかはわかりませんが、これが/[aeiou]/母音に一致すると仮定しましょう。したがって、この正規表現は可換です。(5 階乗) 母音文字の順列? つまり/[aeiou]/、 と同じように動作し/[eiaou]/ます。それが可換であることの利点は何ですか?(PEG の非可換性を参照)

その結果、CFG が直接 PEG に音訳される場合、前者のあいまいさは、可能な解析から 1 つの解析ツリーを決定論的に選択することによって解決されます。代替文法が指定される順序を慎重に選択することにより、プログラマーは、どの構文木が選択されるかを大幅に制御できます。

これは、PEG の文法が CFG の文法よりも優れているということですか?

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

pyparsing - pyparsingでのPEGのセマンティック述語についての確認が必要

PEGペーパーでは、2つのセマンティック述語解析式について説明しています。

  1. そして述語&e
  2. 述語ではありません!e

pyparsingはAnd述語をサポートしていますか?それとも、シーケンス解析式の同義語ですか?Andその場合、それはクラスと同等である必要があります。正しい?

NotNotAny述語を表しますか?

具体的には、仕様の動作に準拠していますか?

解析式foo&(bar)は、テキスト「foo」と一致して消費しますが、その後にテキスト「bar」が続く場合に限ります。解析式foo!(bar)は、テキスト「foo」と一致しますが、その後にテキスト「bar」が続かない場合に限ります。式!(a + b)aは、単一の「a」に一致しますが、これは、aの後にbが続く任意の長さのシーケンスの最初ではない場合に限ります。