問題タブ [marpa]
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.
perl - Marpa パーサー ライブラリはエラー回復をサポートしていますか?
Perl の "Marpa" Earley パーサーが非常に優れたエラー レポート機能を備えていることは知っています。
しかし、ドキュメントやグーグルでエラー回復があるかどうかを見つけることができません。
たとえば、ほとんどの C/C++ コンパイラにはエラー回復機能があり、これを使用して複数の構文エラーを報告しますが、他のコンパイラは最初のエラーで停止することがよくあります。
私は実際に自然言語を解析していますが、入力の一部が失敗した後に再同期して解析を再開する方法があるかどうか疑問に思っています。
例、それを理解できる人のために:
ラオス語の音節を解析しています。ラオス語では、いくつかの母音は分音記号であり、別個の文字としてエンコードされ、前の子音の上に表示されます。ラオス語ウィキペディアのランダムな記事を解析しているときに、そのような母音が二重になっているテキストに出くわしました。これはラオス語の正書法では許可されていないため、タイプミスに違いありません。しかし、数文字以内でテキストが再び優れていることがわかります。
とにかく、これは、エラー回復またはトークン ストリームとの再同期に対する私の一般的な関心を刺激した実際の例です。
perl - Perl Marpa で構造化されていないテキストを破棄してスキップしますか?
Marpa::R2::Scanless::G を使用して、従来のテキスト ファイル形式を解析しています。ファイル形式には、よく構造化されたセクションが一番上にあり、その後に、構造化されていないテキストと uuencode されたものが続きます。後者のものは完全に無視できますが、Marpa SLIF インターフェースに伝える方法がわかりません。残りのテキストは気にしないでください。
非常に簡単に言えば、ファイルは次のようになります。
必要なすべてのデータを上部セクションから解析しましたが、一致させようとしないと下部ジャンクにヒットすると、次のようになります。
潜在的にメガバイトのがらくたを丸呑みするという用語を作成する方法がわかりません。遭遇したテキストに関係なく、ファイルの最後まで進み続けてください。:discard または 'pause => after' を使用しようとしてもうまくいきませんが、おそらくそれらを誤用している可能性があります。
コンテキストについては、解析と字句解析についてしっかりと理解していません。それが機能するまで、私は文法を叩きました。
ambiguity - 解析ツリーを「通過」するのではなく、Marpa 解析フォレストに「沿って」反復する方法は?
あいまいな Marpa 文法とあいまいな入力文字列があるとします。
Marpa を使用して文字列を解析し、解析フォレストを作成できます。フォレスト内の各解析ツリーを反復処理することもできます。
しかし、パース フォレストに沿って反復処理するにはどうすればよいでしょうか。
私が何を意味するかを説明するには:
解析フォレストは一種のグラフであり、代替が分割されるノードと、代替が結合して「メイン ストリーム」になるノードを持つことができます。
これらが 1 つのパース フォレストの代替パース ツリーであるとします。
A B1 C
A B2 C
A B3 B4 C
本流はあるがA
……C
あいまいなB
部分がある。
もちろん、実際の解析では、分岐時に多くのレベルの分岐が存在する可能性があり、単一のメイン ストリームに再結合しないストリームが存在する場合があります。しかし、一般的には、2 つまたは多くの解釈に共通する多くの部分があります。
明確で曖昧なノードのチェーンに沿って反復するには、どのようなアプローチを使用できますか?
実際、グラフ全体を出力できますか?
perl - Marpa: キーワードを識別子として明示的に禁止することはできますか?
私は Marpa で新しい DSL を実装しており、(Regexp::Grammars から) 満足しています。私の言語は、一連の単項演算子と 2 項演算子、C スタイルの識別子を持つオブジェクト、おなじみのドット表記を使用したメソッド呼び出しをサポートしています。例えば:
foo.has(bar == 42 AND baz == 23)
Marpa の文法記述言語が提供する優先ルール機能を見つけて、それを大いに利用するようになったので、G1 ルールはほぼ 1 つしかありませんExpression
。抜粋 (多くの代替案、および簡潔にするために省略されたセマンティック アクション):
ご覧のとおり、スキャンレス インターフェイス (SLIF) を使用しています。私の問題は、これも解析することです。たとえば、次のようになります。
Marpa は、ドットの後には識別子しか存在できないことを認識しているため、それがAND
キーワードである可能性さえ考慮していません。キーワードとして明示的に識別する別の字句解析段階を実行することで、この問題を回避できることはわかっていますAND
が、その小さなペーパーカットは努力する価値がありません。
SLIF でIdentifier
ルールを非キーワード識別子のみに制限する方法はありますか?
perl - 任意の区切り文字のマッチング
以前、複雑でばかげた古いテキスト形式を Marpa で解析することに成功しましたが、もう一度やろうとしています。
この特定の形式には、次のような数百もの異なる種類の 'Begin' および 'End' ブロックがあります。
上記のものの BlahBlah、BarBar、および FooFoo のすべてに一致する単一のルールを作成するにはどうすればよいですか? 少なくとも標準のスキャンレス文法の例では、トークンを動的にキャプチャし、それを再利用してルールを終了する方法は、どの例にもありません。新しい種類のブロックは物事を壊してしまうので、さまざまな種類のブロックをすべて列挙したくはありませんし、その必要もないと思います。
Begin/End ブロックの内容は問題には関係ありません。実際には、それは複雑なごちゃごちゃですが、どうすればいいのかわからないものは何もありません。私は正規表現に頼りたくないので、Marpa をこのための優れたツールにする他の複雑な詳細に手を振っています。
最低限、私が達成しようとしているのは、ブロック タイプ (つまり、「BlahBlah」) のキーと値のマップを文字列としてその内容にマップすることだけです。