問題タブ [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.
parsing - Menhir を使用して非常に寛容な文法を作成することは可能ですか?
Verilog の一部を解析しようとしています。主に、モジュールの定義とインスタンス化を抽出することに関心があります。
Verilog では、モジュールは次のように定義されます。
モジュールは、次の 2 つの異なる方法のいずれかでインスタンス化されます。
この時点では、定義済みまたはインスタンス化されたモジュールの名前を見つけることにのみ関心があります。上記の両方の場合で「foo」。
このメンヒル文法 (verParser.mly) を考えると:
menhir インタープリターでこれを試してみると、モジュール インスタンスをうまく抽出できます。
単一モジュールのインスタンス化では問題なく機能します。
しかしもちろん、これらのいずれかの前に現れる IDENT がある場合、拒否されます。
...そしてもちろん、これらの定義の前に実際の Verilog ファイルに識別子があります。
Verilog 文法を完全に指定する必要はないようにしています。代わりに、文法をゆっくりと段階的に構築して、最終的にはより多くの言語を解析したいと考えています。
IDENT をジャンク ルールに追加すると、上記の問題は修正されますが、ジャンク ルールが IDENT をキャプチャしているため、モジュールのインスタンス化ルールは機能しません。
一致させたくないものをバイパスする非常に寛容なルールを作成することは可能ですか、それとも実際にこのようなことを行うには完全な文法を作成する必要がありますか?
一致させるルールを作成することは可能ですか:
「stuff*」は、最初は RPAREN 以外のすべてに一致しますか?
何かのようなもの :
私は過去に、そのような構造を可能にする PEG パーサーを使用しました。
parsing - これをペグ文法で解析するにはどうすればよいですか?
pegjsを使用してパーサーを作成しようとしています。私は次のようなものを解析する必要があります:
"START"
からへのテキストをキャッチするルールを書くのに問題があります"END"
。
ruby - Treetopの複数形の一致
Treetopを使用して複数の単語をプログラムで照合する方法はありますか。言語学の宝石は単語を複数形にしますが、それをパーサーに戻すにはどうすればよいですか。
これが私がやろうとしていることの例です:
javascript - 入力のPEG.js終了に関する問題
私は次のようなものに一致するPEG.js用の簡単な文法を書き込もうとしています。
つまり、基本的にこれらはセミコロンで区切られたいくつかのテキストです。私の簡略化された文法は次のようになります。
問題は、入力にセミコロン以外のものを入力すると、次のようになることです。
これを解決する方法は?PEG.jsが入力の終わりと一致しないことを読みました。
ruby - 正規表現に似たツリートップのバックトラック?
私が読んだすべてのことは、正規表現のようなTreetopのバックトラックを示唆していますが、それを機能させるのに苦労しています。
次の文法があるとします。
これは文字列と一致しません{abc}
。.+
それは、手紙a
以降のすべてを消費しているからだと思います。つまり、消費abc}
したいだけのときに消費しますabc
。
これは、同様の正規表現が行うこととは異なるように見えます。正規表現/{.+}/
は一致し{abc}
ます。これが可能であるのは、正規表現エンジンがの}
一部としてクロージングを消費した後.+
、一致しなかったためにバックトラックするためであると私は理解しています。
では、Treetopはそのようなバックトラックを実行できますか?もしそうなら、どのように?
}
否定を使用して「 。以外のもの」と一致させることができることを私は知っています。しかし、それは私の意図ではありません。文字列と一致させたいとします{ab}c}
。その場合に必要なトークンは、開始{
、中間の文字列ab}c
、および終了}
です。これは不自然な例ですが、のようなネストされた式を操作する場合に非常に関連性が高くなり{a b {c d}}
ます。
parsing - LL(*)からPEGへの明確で理にかなった変換はありますか?
私はPEG(Parsing Expression Grammar)パーサーを調査中です。私が調査しているトピックの1つは、他の解析手法との同等性です。
From Regular Expressions to Parsing Expression Grammarsで、正規表現を同等のPEGに変換することについての良い論文を見つけました。
私はLL(*)
パーサーのための同様の治療法を見つけたいと思っていますが、まだ手ぶらで出てきています。1で説明した手法の多くは、変換の問題にも適用できるように思われますLL(*)
が、私自身の分析に自信を持てるように、形式主義に十分に没頭していません。
あなたの集合的な助けをいただければ幸いです!
javascript - 単純な文法を PEG.js で動作するものに変換する方法 ("a" が必要ですが、"a" が見つかりました)
PEG.js を使い始めたばかりで、文法に問題があります (デバッグ用に大幅に簡略化されています)。
https://pegjs.org/onlineを使用しています
この文法は解析に失敗しますbdd
。
これは PEG ではできないことですか、それとも文法をこれを解析できるものに変換できますか?
PS を解析しようとすると (誤ってアドバイスされましたか?)bda
無意味なエラーが発生します。
javascript - 生成されたパーサーは、Node.jsでエスケープされた引用符に対してエラーをスローします
PEG.jsを使用して、文字列の解析を含むパーサーを作成しています。
任意の種類の文字を含む文字列は引用符で囲まれ"
、エスケープされた引用符を含めることができます\"
。
これまでのところ、次のルールがあります。
PEG.jsオンラインバージョンで動作し"abc\"def"
、指定された入力に対して生成されます"abc\"def"
。
Node.jsバージョン0.6.21とPEG.jsバージョン0.7.0用に生成されたパーサーは、次のように実行されます。
次のエラーが発生します。
ただし、\\"
代わりにを使用\"
すると、期待される出力で成功します。
この問題の説明または回避策はありますか?特に、パーサーの予想される入力のすべての引用符を二重にエスケープすることはできません。
parsing - この PEG.js 文法で左再帰を削除する
(注:このような他の質問を読みましたが、これを理解できませんでした)。
私はこの文法を書きました:
この入力で
戻ります
そして、私はしたいです
この左再帰ルールはそのようなものを与えることができると思いますが、PEG.js は左再帰をサポートしていません。
この場合、左再帰を削除するにはどうすればよいですか?
PS: これは、オンラインの PEG.js デモでテストできます。
python - pyPEG2:'f(x)'のPEG文法の何が問題になっていますか?
この文法の質問のさらに別の問題点:
私はVolkerBirkのpyPEG2で遊んでいますが、非常に些細なケースで立ち往生しています。
私が得ている例外は次のようになります:
トレースバック(最後の最後の呼び出し):ファイル "test.py"、5行目、print parse(text、grammar)ファイル "/ home / yy / dev / python / len / len / lang / pypeg2 / init .py"、行539、解析t、r = parser.parse(text、thing)ファイル "/ home / yy / dev / python / len / len / lang / pypeg2 / init .py"、行644、解析t、r = self._parse(t、thing、pos)ファイル "/ home / yy / dev / python / len / len / lang / pypeg2 / init .py"、行814、_parse t2、r = self._parse(t、e 、pos)ファイル "/ home / yy / dev / python / len / len / lang / pypeg2 / init .py"、行962、in _parse raise GrammarTypeError( "in grammar:" + repr(thing))pypeg2.GrammarTypeError:文法で:'('
parse()は、Symbol()であるはずの開き角括弧の解析に失敗します。確かに私は明らかな何かを見逃していますが、何ですか?