問題タブ [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 - 文法で G0 規則と G1 規則を分離する際の問題
非常に基本的な Marpa 文法のように見えるものを機能させようとしています。私が使用するコードは以下のとおりです。
これは印刷され$VAR1 = \'foo';
ます。そのため、1 つの単語を問題なく認識します。しかし、単語の文字列を認識したい
スクリプトは次のように出力します。
これは、構造レベル G1 の代わりにトークン化レベル G0 の一部にする (match) 演算子をExprSingle
使用しているためだと思います。~
この:discard
規則では、G0 規則ではなく、G1 規則の間にスペースを許可します。したがって、文法を次のように変更します。
警告は表示されなくなりましたが、結果の値は、とundef
を含むものではなく. 以前、失敗した解析が実際のエラーをスローしたため、それが何を意味するのかは正直わかりません。'foo'
'bar'
文法を変更して、G0 ルールと G1 ルールと思われるものをさらに分離しようとしましたが、まだうまくいきません。
最終的な値はまだundef
です。trace_terminals
「foo」と「bar」の両方がトークンとして受け入れられることを示しています。この文法を修正するにはどうすればよいですか (つまり、単に ではなく、文字列 'foo' と 'bar' を含む値を取得することを意味しますundef
)。
perl - try{} ブロック後の内部状態の変化
私はMarpa::R2を使用しており、 Try::Tinyを使用してエラーをキャッチしようとしています。try
解析コードをブロックに入れると、value
メソッドの結果がundef
. これが私のコードです:
私は文法が何であるかを理解しようとして少し気が狂っていましたが、try
ブロックを削除すると$reader->value
非nullの値になることに気付きました。ブロック$value
内で割り当てても、ブロックが終了すると次のようになります。try
undef
これは、 でエラーをキャッチしたい場合Try::Tiny
、 の処理をすべてブロックに入れ$value
なければならないことを意味しているようtry
です。これは不便です。
誰がこれを引き起こしているのか教えてもらえますか (Perl でこれがどのように可能であるかの説明が欲しいです)? そして、それを修正する方法はありますか?
perl - Marpa::R2::Scanless で単純な最長トークン マッチングを防止する
Marpa パーサーのスキャンレス インターフェイス(SLIF)の現在の実装では、レクサーは次の方法で最長トークン マッチング (LTM) を行うようです。
- すべての終端記号は、入力内の現在の位置で一致しようとします。
- 最長一致以外はすべて破棄されます。
- これらの最長のトークンはパーサーに送られますが、パーサーはそれらを受け入れる場合と受け入れない場合があります。
- トークンが受け入れられない場合、解析は失敗します。
これにより、文法に最長の部分文字列に一致するトークンが含まれているが、現在の位置では発生しない場合、イライラする解析の失敗が発生します。次のコードを検討してください。
これにより、次の出力が生成されます。
期待される出力:
!
が認識された後、key
トークンが続く必要があります。この位置で字句解析を行うと、value
トークンは最長の部分文字列と一致しkey:value
ますが、この位置では発生しません。したがって、解析は失敗します。
質問:手動レクサーを作成せずに期待される出力を達成することは可能ですか?
(レクサーは認識エンジンに予想されるトークンを問い合わせることができ、これらのトークンのみに一致するように制限できることは知っていますが、SLIF にこれを行うよう説得する方法はわかりません。)
perl5 v16.2でMarpa::R2 v2.064を実行しています
編集
Jeffrey Kegler のアドバイスに従って、プレーン文字列よりも長い部分文字列に常に一致するルールを実装したvalue
ため、推奨されます。イベントを使用しpause
て手動で解析できますが、正しいセマンティクスのためにファントム ルールを維持する必要があります。
更新された完全なコードは次のとおりです。イベント処理と更新されたテスト ケース:
これにより、
これは予想される動作です。
perl - Marpa文法で長さ0以上のリストを作成する簡潔な方法は?
マルパ初心者です。文法で 0 個以上の用語のリストを記述するいくつかの方法を試しましたが、複数の解析ツリーを避けたいと考えています。
私の言語には、ちょうど 1 つのコンポーネントがあり、その後に 0+ サブコンポーネントが続きます。
私が最初に試したのはこれでした:
(投稿の最後に完全なコード。)
ここに私の入力があります:
2 つの解析ツリーが得られます。1 つ目は望ましくない undef で、2 つ目は私が好むものです。どちらもリストを本質的にツリーとして返します。
subcomponent-list の nullable ルールは、0 個のサブコンポーネントのケースを許可することでしたが、代替解析である 1+ サブコンポーネントのリストの前に null 要素を導入します。(マルパは一度だけサイクルを下ります、ありがたいことに。)
私の他のアイデアは、subcomponent-list を null 非許容にし、0 または 1 つの subcomponent-lists である中間ルールを導入することでした:
これにより、少なくとも複数の解析が排除されましたが、まだサイクルがあり、圧縮するための厄介なネストされたツリーがあります。
長さ 0+ のリストを作成する、またはシンボルをオプションにするより直接的な方法はありますか?
完全なサンプル コード:
perl - Marpa パーサーは、オプションの最初のシンボルを処理できないようですか?
私は Marpa パーサーに慣れてきましたが、最初のシンボルがオプションの場合に問題が発生しました。次に例を示します。
これを実行すると、次のエラーが表示されます。
Perl バージョン 5.14.2 (debian wheezy)
Marpa バージョン 2.068000
(まだ試していない新しい Marpa 2.069 があるようです)
これは私の文法が間違っているのでしょうか?
perl - Marpa 文法の単語間にギャップを強制する
[\w]
文字が同じ語彙素にない場合、文字が互いに直接隣接して表示されないようにする文法を設定しようとしています。つまり、単語はスペースまたは句読点で区切らなければなりません。
次の文法を考えてみましょう。
これは正常に解析されます。ここで、文法を変更して、 と を強制的に分離したいと考えてい9
ますseptember
。一致する未使用の語彙素を導入することでこれを行うことを考えました[\w]+
:
残念ながら、この文法は次のように失敗します。
lexeme default
これはステートメントを使用して解決できますが、次のようになります。
これにより、次の出力が得られます。
つまり、 と の間9
にギャップがないという事実により、解析が失敗しましたseptember
。これはまさに私が望んでいることです。軟膏の唯一の欠点は、語彙素が実際の文法で使用されていないInaccessible symbol: word
ため、STDERR に迷惑なメッセージがあることです。word
コンストラクター オプションのようにMarpa::R2::Grammar
宣言できたことがわかりましたが、 ではできません。word
inaccessible_ok
Marpa::R2::Scanless
次のようなこともできたはずです。
次に、pause
カスタム コードを使用して実際の語彙素の値を調べ、値に応じて適切な語彙素を返します。
キーワードまたは数字と単語を使用するが、隣接する語彙素を空白や句読点で区切ることなく一緒に実行することを禁止する文法を構築する最良の方法は何ですか?