問題タブ [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.
scala - Scalaパーサーコンビネーター:マッチを反転させる方法は?
Scala パーサー コンビネーターとの一致を反転することは可能ですか? 一連のキーワードで始まらない行をパーサーと一致させようとしています。これは、煩わしいゼロ幅の負の先読み正規表現 (例: "(?!h1|h2).*"
) で行うこともできますが、Scala パーサーで行うほうがよいでしょう。私が思いついた最高のものはこれです:
使うアイデアはこちら~!すべて一致する正規表現へのバックトラックを禁止してから、何も一致しない正規表現 "(?=a)b".r を続行します。(ちなみに、常に失敗する事前定義されたパーサーはありますか?) そうすれば、キーワードが見つかった場合は行が一致しませんが、キーワードが一致しない場合は一致します。
これを行うためのより良い方法があるかどうか疑問に思っています。ある?
scala - Scala パーサー コンビネーター、大きなファイルの問題
私は次のようにパーサーを書きました:
次のように FileReader を使用して (270MB) ファイルから解析する場合:
を取得しますException in thread "main" java.lang.StackOverflowError
( a でラップも試みましたBufferedReader
)が、最初にファイルを次のように文字列に読み込むことで修正できます。
これはなぜですか?最初に文字列として読み取らないようにする方法はありますか?それは無駄に思えますか?
scala - Scala パーサー コンビネータと改行区切りテキスト
リストが1つ以上の空白行で区切られている改行区切りの単語リストを読み取るScalaパーサーコンビネーター文法を書いています。次の文字列を指定します。
返してもらいたいList(List(cat, mouse, horse), List(apple, orange, pear))
です。
単語リストを改行で区切られた単語として扱うこの基本的な文法を書きました。のデフォルト定義をオーバーライドする必要があったことに注意してくださいwhitespace
。
これは空白行を空の単語リストとして誤って扱います。
(真ん中の空のリストに注意してください。)
各リストの最後に行末をオプションで付けることができます。
これは、リスト間に単一の空白行がある場合を処理しますが、複数の空白行でも同じ問題があります。
lists
複数の行末区切り文字を許可するように定義を変更してみました。
しかし、これは上記の入力にかかっています。
複数の空白行を区切り文字として処理する正しい文法は何ですか?
parsing - scala パーサー コンビネーターを使用したインデント ベースの言語の解析
Scala のパーサー コンビネーターを使用して、インデントが重要な言語を解析する便利な方法はありますか? (例: Python)
scala - Scala 2.9:パーサーサブクラスが「Elem」オーバーライドを認識しない?
レクサーとして機能するパーサーを作成しました。このレクサーはファイルを解析し、トークンのリストを返します。各トークンは、共通の特性を拡張するケースクラスまたはオブジェクトです。
現在、レクサーの出力用のパーサーを作成しようとしていますが、非常に紛らわしい問題が発生しました。パーサーは、ケースオブジェクトを暗黙的にキャストできますが、apply(classHere)
手動で呼び出そうとすると、フィットをスローします。
以下は私のコードの簡略版です。
コンパイラは、次のメッセージを報告しますdoesNotWork
。
どうすればこれを修正できますか?
parsing - モナド変換子パーサーコンビネーターでバックトラックを制限する方法
tl; dr、バックトラックを制限できるパーサーを実装するにはどうすればよいですか?パーサーはモナド変換子スタックです。
このアプローチの論文、ブログ、または実装例は見つかりませんでした。バックトラッキングを制限するための一般的なアプローチは、コンストラクターが追加されたデータ型、またはバックトラッキングがデフォルトでオフになっているParsecアプローチのようです。
私の現在の実装(commit
コンビネータを使用、以下を参照)は間違っています。型、型クラスに属しているかどうかはわかりません。私のインスタンスは、本来あるべきと思われるほど一般的ではありません。
誰かがこれをきれいに行う方法を説明したり、私にリソースを教えてもらえますか?
現在のコードを以下に追加しました。投稿が長すぎてごめんなさい!
スタック:
意図は、バックトラッキングが中間層で動作することです-Nothing
または空のリストは必ずしもエラーを生成しません、それは単に別のブランチを試す必要があることを意味します-一方、最下層はエラーのためのものです(いくつかの文脈で情報)解析をすぐに中止します。
いくつかの構文解析クラス:
それらのインスタンス:
そして、さらにいくつかのコンビネータ:
次に、これらのパーサー:
これらの結果を与える:
scala - Scala コンビネーター パーサーが文字列と一致するかどうかをテストする方法
コンマ区切りの 10 進数のリストを処理する Scala コンビネーター パーサーがあります。
パターンに一致する文字列が与えられると、関数itMatches
は戻ります。true
例えば:
これを行うためのより簡潔な方法はありますか?ドキュメントには見つかりませんでしたが、私の関数は少し冗長に見えるので、何かを見落としているのではないでしょうか。
scala - Scala Combinator パーサーで int と float を区別する
int と float を決定する scala コンビネーター パーサー (具体的には JavaTokenParsers 経由の RegexParsers) を取得する際に問題が発生しました。この特定の問題についての言及がどこにも見つからないように見えるので、ここで本当に基本的な何かが欠けているに違いありません。問題のパーサー コードを含む仕様を含めました (もちろん、インクルードは除きます)。
これは、次のエラー メッセージで失敗します。
このスレッドに基づいて考えた 1 つ、wholeNumber の後に a を配置しまし<~ not(not('.'))
たが、これで問題が解決したようには見えませんでした。
parsing - Scalaでパーサーコンビネーターを使用して再帰的なデータ構造を作成する
私はScalaの初心者で、S99に取り組んでScalaを学ぼうとしています。問題の1つは、文字列からツリーデータ構造への変換に関係しています。Scalaのパーサーコンビネーターライブラリを使用してそれを行う方法も知りたいので、「手動で」それを行うことができます。
ツリーのデータ構造は次のとおりです。
そして、入力は次のような文字列であると想定されています。a(b(d,e),c(,f(g,)))
次のようなものを使用して文字列を解析できます
しかし、どうすれば解析ライブラリを使用してツリーを構築できますか?^^
たとえば、ある文字列を整数に変換するために使用できることを知っています。私の混乱は、のインスタンスを作成するときに左右のサブツリーを「知る」必要があることから来ていますNode
。どうすればそれができますか、それとも私が何か違うことをしたいという兆候ですか?
またはのようなパーサー演算子を使用してツリーを直接構築するよりも、パーサーが返すもの((((((a~()~(((((b~()~d)~,)~e)~)))~,)~(((((c~()~)~,)~(((((f~()~g)~,)~)~)))~)))~))
上記の入力例の場合)を取得し、それに基づいてツリーを構築する方がよいでしょうか?^^
^^^
c - Cのパーサーコンビネーターのより良い方法は?
追加の依存関係 (パーサー ジェネレーター、ライブラリなど) を使用せずに、C の (サブセット) をゼロからブートストラップしようとしています。また、関数型プログラミングの優れた手法であるパーサー コンビネーターのアイデアも活用したいと考えています。このアイデアを関数型の世界から手続き型 C に、簡潔かつ実用的な方法で取り入れたいと思います。
次のおもちゃの文法に必要なパーサーコンビネーターをいくつか実装しようとしました。
person
文字で始まるトークンはどこにありますか。たとえば、トークン リスト
に解析されます
(この本は Haskell を使用しており、言語にとらわれないようにするのは難しいですが、アイデアはわかります :-)
これを C で実装しました。コードはこちらで確認できます: https://gist.github.com/4451478
この実装には 200 行以上の C コードが必要であり、本に書かれている Haskell の約 20 行よりもはるかに多くなります。そのため、C でパーサー コンビネーターを実行する正しい軌道に乗っているかどうか、および改善の可能性があるかどうかはわかりません。どんな提案も歓迎します。前もって感謝します。