問題タブ [pegjs]
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.
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"
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 上で入手できる情報はほとんどありません。
私は間違った木を吠えていますか?正規表現スキャンに戻り、解析を忘れるべきですか?
ありがとう
javascript - Rhino (Java SE 6 ScriptEngine API) を使用して PEG.js 0.7.0 パーサーを構築する方法
PEG.js バージョン 0.6.1 を使用して Maven プラグイン (つまり、Java コードから PEG.js を呼び出す) を使用してパーサーを構築してきましたが、新しいバージョンにアップグレードしようとすると、次のエラー メッセージが表示されて失敗します。
sun.org.mozilla.javascript.internal.EcmaError: SyntaxError: missing ; before statement (#3213(eval)#1) in #3213(eval) at line number 1
デバッグ中に、PEG.buildParser() 関数呼び出しから生成されるパーサーが構文的に間違っているように見えることに気付きましたが、もちろん、ブラウザーから呼び出している間は発生しません。
これが私がそれを呼び出す方法です:
私grammarSource
のテストケースでは、はウェブサイトで例として使用される基本的な文法であり、PEGJS_LIB = peg-0.7.0.js
.
どんなアイデアでも大歓迎です!私はここでそれらを使い果たしました...
parsing - これをペグ文法で解析するにはどうすればよいですか?
pegjsを使用してパーサーを作成しようとしています。私は次のようなものを解析する必要があります:
"START"
からへのテキストをキャッチするルールを書くのに問題があります"END"
。
javascript - 入力のPEG.js終了に関する問題
私は次のようなものに一致するPEG.js用の簡単な文法を書き込もうとしています。
つまり、基本的にこれらはセミコロンで区切られたいくつかのテキストです。私の簡略化された文法は次のようになります。
問題は、入力にセミコロン以外のものを入力すると、次のようになることです。
これを解決する方法は?PEG.jsが入力の終わりと一致しないことを読みました。
javascript - 単純な文法を PEG.js で動作するものに変換する方法 ("a" が必要ですが、"a" が見つかりました)
PEG.js を使い始めたばかりで、文法に問題があります (デバッグ用に大幅に簡略化されています)。
https://pegjs.org/onlineを使用しています
この文法は解析に失敗しますbdd
。
これは PEG ではできないことですか、それとも文法をこれを解析できるものに変換できますか?
PS を解析しようとすると (誤ってアドバイスされましたか?)bda
無意味なエラーが発生します。
parsing - この PEG.js 文法で左再帰を削除する
(注:このような他の質問を読みましたが、これを理解できませんでした)。
私はこの文法を書きました:
この入力で
戻ります
そして、私はしたいです
この左再帰ルールはそのようなものを与えることができると思いますが、PEG.js は左再帰をサポートしていません。
この場合、左再帰を削除するにはどうすればよいですか?
PS: これは、オンラインの PEG.js デモでテストできます。
peg - この PEGjs ルールをどのように DRY しますか?
以下は、私がやろうとしていることに対してうまく機能しますが、明らかに非常に反復的です。次の例と一致する必要があります。
- #id.class1.class2 attr="asdsa"
- .class1.class2 attr="asdsad"
- attr="asds"
使いたくなる
しかし、3 つのコンポーネントがすべて欠落している場合は一致させたくありません。3 つのオプション コンポーネントのルールを指定するにはどうすればよいですか?ただし、少なくとも 1 つが存在する必要があります。
syntax-highlighting - PEG.js文法からTextMate言語文法を生成します
PEG.js文法をTextMate文法に変換するツールはありますか?
私は自分の言語を構築していて、好みのエディターであるTextMateでその言語の構文を強調表示したいと思っています。私の言語の文法はPEG.jsで構築されています。このユースケースのTextMateドキュメントによると、 PEG.jsと互換性のない形式でTextMate文法を記述する必要があります。
新しいTextMate文法を書き始めましたが、文法全体、または許容可能な構文の強調表示に関連するサブセットを翻訳するのにかなりの時間がかかることにすぐに気付きました。私は信じられないほど怠惰で、このような面倒な作業をすべてやりたくないので、このタスクを自動化することを考えました。
誰かが私にPEG.js文法からのTextMate文法の生成を自動化する方法、または少なくともスピードアップする方法の手がかりを教えてもらえますか?
javascript - このテキスト ファイルの簡単な pegjs 文法を作成するにはどうすればよいですか?
このテキスト ファイルを行に分割し、行を分類したいだけです。行が「Qty」で始まる場合、行が「GST」で始まるまで、次の行は注文品目です。
行が「合計金額」で始まる場合、これが合計金額の行です。