問題タブ [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.
ruby - Parsletで後方参照は利用できますか?
\1
典型的な正規表現の機能と同様に、parslet の前の文字列を後方参照する方法はありますか?
次のようなブロック内の文字を抽出したい:
「Marker」は既知の文字列ですが、「SomeName」は事前に知られていないため、次のようなものが必要だと思います。
私が知らないのは、Parslet や Ruby 言語を使用して backreference_to_name ルールを記述する方法です。
c++ - Boost Spirit を使用して区切り文字列と整数を抽出する
Boost Spiritを使ってstring like"ABC10DEF20"
をarrayに変換しようとしています。["ABC", 10, "DEF", 20]
「区切りなし」が正しい用語かどうかはわかりませんが、空白や別の区切り文字で分割するのではなく、整数と非整数の境界で分割したいと考えています。
私は次のようなコードを思いつきました:
入力の場合、"ABC10DEF20"
この結果は[ 65, 66, 67, 10, 68, 69, 70, 20 ]
(文字列ではなく、整数に格納された文字列部分の整数と ASCII コンポーネントのみ)。入力については、意図したとおり"10"
に取得します。[ 10 ]
javascript - 動的キー名を持つキー、値オブジェクトを返す
PEG.jsには次のルールがあります
解析[hello] world
すると、次のようになります。
{"key": "world"}
.
返してほしい
{"hello": "world"}
.
これは可能ですか?オブジェクト キーが動的な値を受け入れるようにするにはどうすればよいですか。
regex - トレーニング例による文字列解析
私は非常に多くの解析ルール (つまり、文字列を別の文字列または構造化データに変換する関数) を記述する必要がある立場にあり、これには PEG を使用すると考えていましたが、例文とその正しい解析のリストを提供するだけで簡単に書くことができ、技術的には些細なことのように思えますが、混乱しています.
私は PEGjs (構文解析式文法ツール) と正規表現をいじりました。私の目的では、ニーズは本当に非常に基本的なものであり、PEG と正規表現によって提供されるすべての力よりもはるかに少ないようです。
解析したいものの例を次に示します。
おわかりのように、私は何百もの例文をそれぞれ正しい構文解析と組み合わせて提供し、パターンに従うすべての文章を構文解析するために必要な関数をコンピューターに記述させたいと考えています。
これを理解するのは少し難しいので、すべてのハッカーに質問します:
- 入力文のさまざまなバリエーションを提供するだけで、非常に単純なロジックのみが必要になるというのは本当ではないでしょうか (つまり、機械学習も、PEG も、正規表現もありません)。
- 機械学習機能 (ベイジアン?) でこれを簡単にできるでしょうか? (私のアプリケーションでは、文の解析に 100% の確実性は必要ありません。あいまいさは問題ありません。特に、ユーザーがそのあいまいさを解決できるように提示できる場合)
- この種の問題に適したツール (ライブラリ) やロジック (疑似コードをお願いします!)、または単にその性質を説明するものは何ですか?
parsing - PEG 文法が期待どおりに機能しない
私は、音楽プログラミング言語のコードを取り、音楽イベント (音符、和音、音量/テンポの変更など) の解析ツリーを作成する PEG 文法に取り組んでいます。私の MPL の特徴は、音声、つまり同時に発生するさまざまなイベント シーケンスをサポートすることです。Instaparse文法でこれを正しく解析するのに苦労しています... 私が欲しいのは、 voices
1 つ以上voice
の で構成されるタグで、それぞれが音声定義 (例: V1:
) と任意の数のイベントで構成されます。voices
タグは、(V0:
分割されたボイスの終わりを意味し、1 つのボイスまたは「ボイス ゼロ」に戻ることを意味します)、またはファイルの末尾で終了する必要があります。
以下は進行中の文法の抜粋です (わかりやすくするためにnote
、 、 などの定義は省略しています)。chord
次のコードがあるとします。
パーサーを実行すると、次の出力が得られます。
これはまさに私が欲しいものです。はタグのV0:
終わりを示しvoices
、最後の 5 つのノートはタグ内に単独で存在しpart
ます。
ただし、をに変更するV0
とV2
、次のようになります。
何らかの理由で、voice
1 タグまたはそのvoice-events
タグのいずれかが想定どおりに終了せず、2 番目のタグが最初の のvoice
一部として飲み込まれます。また、2 番目のタグを付けたくありません。2 はプライマリタグ内にある必要があります。voice
voice-events
voices
voice
voices
私が欲しいのはこれです:
何が間違っているのかわかりませんが、voice
タグやタグを定義する方法に関係があると思いますvoice-events
。それは私が否定的な先読みをどのように使用しているかに関係しているかもしれませんが、それはまだ完全には理解していないと思います. 文法を修正する方法を誰かが理解できますか?
ありがとう!:)
解決しました!
ありがとう、@DanielNeal! 私はこれに文法を作り直しました。これはまさに私が望むように機能します:
大きな変化は、私が と を定義する方法にpart
ありevent
ました。以前は、これらの用語をvoices
イベントとして定義していたため、後続voice
の はすべて消費され、前voice
のにまとめられていましたevent
。anvoices
の定義を取り除き、可変数のグループ化またはs になるようevent
に再定義することで、あいまいさを排除し、文法が希望どおりに動作するようにしました。part
voices
event
その後、events
内のは適切にグループ化されましたが、すべてのボイスを同じグループ内に配置する必要がある場合、voice
各ボイスが個別のタグ内にあることにまだ問題がありました。タグが aまたはファイルの末尾 ( ) で終わるように指定することで、これを修正しました。つまり、タグが消費するコードの量をより具体的に指定します。voices
voices
voices
"V0:"
\z
voices
この話の教訓は、もしあなたが PEG 文法を書いていて問題を抱えているなら、おそらく定義があいまいでないようにする必要があるということです! また、否定的な先読みをまったく使用しないことになりました。これは、文法を単純化/曖昧さを解消するのに大いに役立ったと思います。
parsing - パーサーは、任意の改行と空白の解析を停止しません
だから、私は pegjs で非常に基本的な Lisp パーサーを書こうとしていて、Lisp コードが構文的に有効で 1 行に収まる限り、同じコードを吐き出すことができました。
コード内の任意の場所に挿入された改行文字と余分な空白を受け入れることができるようにパーサーを拡張したいと考えています。
したがって、すべてが1行にある限り機能するコードは次のとおりです。
次に、改行と空白を許可しようとして、「タプル」のルールを次のように変更してみました
しかし、この変更により pegjs は無限ループに入りますが、ルールへの追加は再帰的ではないように見えます。
注:私が何をしようとしているのか不明な場合は、pegjs が解析するパーサーを吐き出すような文法を書いています。
文字列と同じコードを吐き出すか、単に
どちらも私にとってはうまくいきます。
私の現在の作業文法が行うことは、
と出力
各「トークン」または「タプル」の後に改行文字を 1 つだけ許可するのは些細なことですが、合法的なコードとして次を受け入れたいと思います。
python - Python 3.4 でのパセリ パーサーが機能しない
私は Python の初心者ですが、いくつかのテキスト ファイル (VCard *.vcf) を解析したいので、Allen Short の Parsley を見つけました。しかし、新しい Python3.4 では動作しないようですが、動作するバージョンはありますか? 私はpypi.python.orgからのバージョンを持っています ところで:この名前の他の多くのプロジェクトのために、パセリは悪い名前です... readme からの例があります...
実行後、次のように返されます。
EDIT 2014.06.12 解決策を見つけました.pipは古いバージョンのパセリをインストールしました。Python 3.X https://github.com/vsajip/parsleyで動作する github に ?fork があります。