問題タブ [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 - 標準パターンでCharSequenceから日付を解析します…
私は外部ツールのコマンドラインインターフェイス用のパーサーを作成しており、Scalaのパーサーコンビネーターライブラリを使用しています。この一環として、EEE MMM d HH:mm:ssyyyyZ形式の標準日付を解析する必要があります。
Scalaのパーサーコンビネーターは「ストリームベース」であり、Stringsの代わりにCharSequenceで動作します。JodaTimeのjava.text.DateTimeFormatまたはDateTimeFormatはどちらも文字列で機能するため、どちらも使用するのが難しくなります。
今のところ、日付を解析するためにこのような独自の正規表現パーサーを作成する必要がありましたが、JodaTimeで行われた作業をパーサーに組み込む方がはるかに望ましいです。私は本当に車輪の再発明をしたくありません。私はJodaTimeのソースコードを見てきましたが、CharSequencesだけでなくStringsで動作する必要がある理由がよくわかりません。私はいくつかの側面が欠けていますか?
parsing - Scalaパーサーコンビネーターを使用してCSVファイルを解析します
Scalaパーサーコンビネーターを使用してCSVパーサーを作成しようとしています。文法はRFC4180に基づいています。私は次のコードを思いついた。ほぼ機能しますが、異なるレコードを正しく分離することができません。私は何を取りこぼしたか?
更新:問題は解決しました
デフォルトのRegexParsersは、正規表現を使用して、スペース、タブ、キャリッジリターン、改行などの空白を無視します[\s]+
。上記のパーサーがレコードを分離できないという問題は、これが原因です。skipWhitespaceモードを無効にする必要があります。whiteSpace定義を単にに置き換え[ \t]}
ても問題は解決しません。フィールド内のすべてのスペースが無視されるため(したがって、CSVの「foobar」は「foobar」になります)、これは望ましくありません。したがって、パーサーの更新されたソースは
java - Java用のScalaコンビネーターと同じくらい素晴らしいパーサーコンビネーターはありますか?
Scalaのパーサーコンビネーターに関するチュートリアルを読みましたが、Javaに「魔法のような」ものがあるのではないかと思っていました。私が見つけた最高のものはJParsecでした。
scala - scala.util.parsing.ast.Bindersはどのように使用されることになっていますか?
私は現在Scalaで小さなコンパイラーを実装しており、コンテキスト分析用のコンポーネントを実行しているときにBinders
、パッケージ内の特性を発見しましたscala.util.parsing.ast
(Scala 2.9 RCを使用しています)。これは、解析時に名前バインディングを有効にするために文書化されています。それはとても面白そうだし、私はたくさんグーグルしてきましたが、それをどうやって使うのかまだ分かりません。もちろん、抽象構文を派生させることはできますがBinders
、そこから先に進む方法がわかりません。ネットでの使い方の例はありますか?
scala - Scala パーサー、「pat <~ pat ~> pat」が機能しないのはなぜですか?
単純なパーサー コンビネーターを試してみると、コンパイル エラーが発生します。
「スミス、ジョー」を Name(Joe、Smith) のような名前オブジェクトに解析したいと思います。十分に単純だと思います。
これに関連するコードは次のとおりです。
そして、私はそれを介してテストしています
コンパイル エラーの取得:
ここで私が見逃しているのは何ですか?
scala - 算術式の文法とパーサー
最近、算術式のまともな文法を探していましたが、pow(..., ...)
たとえば無視するなど、簡単なものしか見つかりませんでした。その後、自分で試してみましたが、期待どおりに機能しないこともありました。たとえば、-
式の前に単項を許可するのを逃して修正しました。おそらく、誰かが私の現在のアプローチを見て、それを改善することができます. さらに、算術式を解析できるようにすることは一般的なタスクであるため、他の人が利用できると思います。
したがって、次のように評価できます。
改善の提案はありますか?正しい文法を使用していますか?それとも、解析できない有効な (提供された関数に関して) 算術式をユーザーが入力するのは時間の問題ですか?
(演算子の優先順位はどうですか?)
parsing - Scala パーサー コンビネーター、行末での失敗
Scala でIcon プログラミング言語のインタープリターを構築しようとしています。現在、パーサーの設定に取り組んでいます。
これまでに書いたコードは次のとおりです。
さて、私の問題は、この入力でこのコードを実行すると:
書き込み(1~5) & 書き込み(3~5)
次の出力が得られます。
& 演算子と一致するかどうかを確認する方法として、出力を追加しました。
コードは、次のような他の奇妙な入力でも正常に実行されます。
write((if &fail then 3 else 5) to (3 to 5))
そのため、特に andexp パーサーに関連する問題のようです。
私は Scala とパーサー コンビネーターにまったく慣れていないので、助けていただければ幸いです。適切なドキュメントを見つけるのはやや難しいと思います。
scala - Scalaのパーサーコンビネーターの結果でパターンマッチングを行う方法
入力文字列を解析するマルチスレッドRPCサーバーがあります。Scalaのパーサーコンビネーターライブラリがマルチスレッドセーフではないという問題が発生しました。Parsers.scalaのvarlastNoSuccessがすべての解析で使用されます。この行でNullPointerExceptionが発生します
パーサーの1つを拡張するオブジェクトを作成することによってパーサーを実装するデフォルトの方法ですが、それぞれが独自の内部状態を持つようにオンデマンドでパーサーを構築したいので、オブジェクトの代わりにクラスを使用しています。ただし、結果のパターンマッチが必要なため、コンパイルできません。
で失敗する
parsing - Scala コンビネーター パーサーで C スタイルのコメントを無視する
私のパーサーが C スタイルのコメントを尊重する (無視する) ようにする最も簡単な方法は何ですか? 両方のコメント タイプに興味がありますが、一方のタイプだけの解決策も歓迎します。
私は現在、単に JavaTokenParsers を拡張しています。
java - ScalaパーサーコンビネーターとANTLR/Javaで生成されたパーサー?
私は主にScalaで書かれたアプリの式パーサーを書いています。ScalaでASTオブジェクトを作成しましたが、パーサーを作成する必要があります。Scalaに組み込まれているパーサーコンビネーターとANTLR3について聞いたことがありますが、どちらがより優れたパフォーマンスとコードの記述のしやすさを提供するのでしょうか。ここのところ:
ANTLRの長所
- よく知られている
- 速い
- 外部DSL
- ANTLRWorks(パーサー文法のデバッグ/テストに最適なIDE)
ANTLRの短所
- Javaベース(Scalaの相互運用は難しいかもしれませんが、経験はありますか?)
- 実行時に大きな依存関係が必要
パーサーコンビネーターの長所
- Scalaの一部
- ビルドステップが1つ少なくなります
- 実行時の依存関係は必要ありません。たとえば、Scalaのランタイムライブラリにすでに含まれています
パーサーコンビネーターの短所
- 内部DSL(実行が遅くなる可能性がありますか?)
- ANTLRWorksはありません(優れたパーサーテストおよび視覚化機能を提供します)
何かご意見は?
編集:この式パーサーは、代数/微積分式を解析します。ファイナライズされると、Android用アプリMagnificalcで使用されます。