問題タブ [parser-combinators]

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.

0 投票する
1 に答える
1824 参照

scala - Scala: 異なるオブジェクトのパーサー コンビネーターを組み合わせる方法

パーサー コンビネーターを実装するオブジェクトのファミリが与えられた場合、どのようにパーサーを組み合わせることができますか? Parsers.Parserはインナー クラスであり、Scala ではインナー クラスはアウター オブジェクトにバインドされるため、話は少し複雑になります。

以下は、異なるオブジェクトからの 2 つのパーサーを結合しようとする例です。

これにより、次のエラーが発生します。

この問題の解決策は既に見つけましたが、最近 scala-user ML (パーサーを別のパーサーに挿入する問題) で取り上げられたので、ここにも置く価値があるでしょう。

0 投票する
1 に答える
266 参照

scala - パーサーコンビネーター情報

scala で解析コンビネータを使用しています 再帰パーサーがある場合:

パーサーが消費した入力文字数を確認するにはどうすればよいですか?

0 投票する
2 に答える
526 参照

parsing - scala での再帰パーサーの高度な制御

この再帰パーサーは、入力の最後まで "(?ui)(regexvalue)".r を解析しようとします。定義された数の文字が「uninterestingthings」によって消費されたときに解析を禁止する方法はscalaにありますか?

UPD:私は1つの悪い解決策を持っています:

欠点:
- すべてのメンバーが遅延 val であるとは限らないため、PackratParser には時間のペナルティがあり
ます

0 投票する
2 に答える
559 参照

scala - Scala パーサー コンビネーター: x に ")" を含めることができる場合に "if(x)" を解析する方法

私はこれを機能させようとしています:

ここで、regularStrは、")" を含む多くのものを受け入れるように定義されています。もちろん、これを受け入れ可能な入力にしたい: if(foo())。しかし、任意のif(x)については、 regularStrの一部として ")" を使用しているため、このパーサーは決して成功しません。

私は何が欠けていますか?

編集

regularStr は正規表現ではありません。次のように定義されます。

記号は次のとおりです。

徹底的な言語チェックは必要ありません。制御構造だけが必要です。したがって、if() の "()" の内容はあまり気にしません。識別子、記号などの任意のシーケンスを受け入れたいと考えています。 " は if の "条件" です。

0 投票する
2 に答える
2321 参照

scala - Scalaパーサーコンビネーターベースのパーサーのエラーメッセージをさらに改善するにはどうすればよいですか?

Scalaパーサーコンビネーターに基づいてパーサーをコーディングしました。

通常、結果の解析エラーメッセージはかなり良いものです。しかし時々それはちょうどになります

これは、引用符が閉じられておらず、パーサーがEOTに到達した場合に発生します。ここで見たいのは、(1)パーサーが「」を期待したときにパーサーがどのようなプロダクションであったか(複数あります)、および(2)入力のどこでこのプロダクションが解析を開始したか(これは、開始引用符が入力にあります)エラーメッセージを改善し、エラーが発生したときの実際の内部解析状態に関する詳細情報を含める方法を知っている人はいますか(おそらく、本番ルールのスタックトレースなど、より適切に識別するためにここで合理的に指定できるもの)エラーの場所)ところで、上記の「行32、列1」は実際にはEOT位置であるため、もちろんここでは役に立ちません。

0 投票する
1 に答える
647 参照

http - Packrat による HTTP の解析

誰かが HTTP プロトコルを scala 2.8 packrat-parsing で解析する方法を教えてくれませんか?

添付された HTTP レスポンスの例を解析する必要があります

  • ResponseStatusCode:Int
  • ヘッダー:リスト[(文字列,文字列)]
  • 本体: String、Array[Byte]、CharBuffer など

Packrat-Parser の短い使用例は非常に高く評価されています。ありがとう!

0 投票する
3 に答える
3240 参照

scala - BNF 文法から Scala コードを生成するレクサー/パーサー

ocamlyacc現在、BNF 文法 (優先順位と結合性を持つファイル)から Scala コードを生成するレクサー/パーサーを探しています。それを行う方法についてほとんど何も見つけられなかったので、私はかなり混乱しています。

解析のために、私はscala-bison(私が扱うのに多くの問題を抱えていることを)発見しました。他のすべてのツールは、Scala にインポートされた単なる Java パーサーです ( などANTLR)。

字句解析については、何も見つかりませんでした。

Scala の有名なパーサー コンビネーターも見つけましたが (間違っていたら訂正してください)、それらが非常に魅力的であっても、主にバックトラッキングが原因で多くの時間とメモリを消費します。

だから私は2つの主な質問があります:

  • 人々が _parser コンビネータだけに集中しているように見えるのはなぜですか?
  • Scala で使用する最適なレクサー/パーサー ジェネレーターの提案は何ですか?
0 投票する
2 に答える
1219 参照

scala - Scala Parser Combinators からのトークンのフィルタリング

Scala パーサー コンビネーターを使用しているときに、レクサーからパーサーへの一連のトークンをフィルター処理するにはどうすればよいですか?

説明させてください - Lexer (extending StdLexical) と Parser ( extending ) のかなり標準的なパターンがあるとしStdTokenParsersます。lexer は一連の文字を一連のトークンに変換し、次にパーサーは一連のトークンを抽象構文木 (タイプExpr) に変換します。

ストリームのどこにでも発生する可能性のあるいくつかのトークンをフィルターで除外するオプションが必要であると判断したため、これらのトークンを削除するためにレクサーとパーサーの間に収まる関数が必要です。たとえば、レクサーでコメントをトークン化し、後でこれらのコメントを除外することができます。

このフィルターを作成する最良の方法は何ですか? これは、パーサー コンビネーターのイディオムを使用できますが、そうする必要はありません。

サンプルの現在のコード:

私はこのようなものを書くことができるようにしたいと思います:

0 投票する
2 に答える
3886 参照

scala - 再帰的なbnfのScala Parser Combinatorsトリック?

この構文に一致させようとしています:

私のscala packratパーサーコンビネーターは次のようになります:

しかし、これはうまくいきません。それは「貪欲に一致」し、私に教えてくれます:

または、|を aに変更すると|||、stackoverflow が発生します。

エラーが発生する理由がわかりました。上記のような構文を解析するにはどうすればよいですか? それは私には難解ではないようです

編集: http://scala-programming-language.1934581.n4.nabble.com/Packrat-parser-guidance-td1956908.htmlで参照されている論文に基づいて、 私のプログラムが実際に新しい packrat パーサーを使用していないことがわかりました。

すなわち。に変更Parser[Any]して代わりにPackratParser[Any]使用するlazy valdef

上記を次のように書き直しました。

0 投票する
2 に答える
1390 参照

scala - HTML またはテキストに埋め込まれた言語 (php など) の Scala パーサー コンビネーター

私はここしばらく Scala パーサー コンビネーターをいじっており、組み込み関数を使用して、適切に動作し、必要なことを最大限に実行する方法をいくつか学びました。

しかし、組み込み言語 (php や ruby​​ の erb など) を作成するにはどうすればよいでしょうか。実際のコードの埋め込み以外では、空白を無視しないようにする必要があります。

特定の正規表現一致までのすべてのテキストに一致する単純なパーサーを作成することができましたが、これを行うためのより良い、きれいな方法を探しています。おそらく、必要なものを実行する定義済みの関数がいくつかあります。

テスト言語は、次のようなテキストを解析します。

次のコードによって生成されます。