問題タブ [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.
regex - Scala で JavaTokenParsers を使用すると、単純な stringLiteral マッチングが失敗する
外部 DSL の作業を開始したばかりですが、問題が発生しました。私は非常に簡単なテストを書きました。Scala 2.9.0-1 と scalatest 1.6.1 を使用します。
実行すると、解析中に失敗して次のように返されます。
私が間違っていたアイデアはありますか?私は基本的に Dean Wampler の本 (http://ofps.oreilly.com/titles/9780596155957/DomainSpecificLanguages.html) に従いました。
parsing - Scala パーサー コンビネーターと Reader 無限ループ
Scala パーサーのコンビネーターに少し混乱しています。Reader のカスタム実装を使用して、トークンのリストを直接読み取ります。
私を困惑させているのは、実際のパーサーによって完全に無視されているように見え、 /atEnd
を使用すると無限ループ/無限再帰が発生することです。*
rep
.net - FParsecのデフォルトのエラーメッセージ
次のパーサーを定義しているとしましょう。
解析すると、予想どおりエラーが発生します。
なぜ彼が手紙を期待しているのに手紙が見つからないのかが問題だと判断できないのか興味があります。その情報を自分でパーサーに追加する予定はありますか?
parsing - 述語に対して入力を検証し、それ以外の場合は失敗するパーサーを作成する方法
データ構造を生成し、述語を実行してその一貫性を検証するパーサーを作成したいと考えています。述語が返される場合false
、パーサーはカスタムError
オブジェクトを返す必要があります (Failure
これは によって実現できるため、 ではなく^?
)。
それを実現できるパーサーの演算子を探しています。たとえば、整数のリストを解析し、それらが異なることを確認したいとしましょう。私はこのようなものが欲しいです:
上記^!
のコードは、私が探しているものです。パーサー出力を検証し、検証されない場合に有用なエラー メッセージを返すにはどうすればよいですか?
scala - コンビネーターパーサーのリスト/シーケンスを単一のものに変換する
マッピングによってこれらの値に依存するパーサーのリストを作成できる値のリストがあります(例を参照)。次に、パーサーのリストを連結によって単一のパーサーに変換します。
1つの可能性はとを使用することfoldLeft
です~
:
これは効率的ですか?
コンビネーターパーサーがどのように機能するかわかりません。リストの長さの深さのコールスタックはありますか?したがって、非常に長い連結でSOエラーが発生する可能性がありますか?
もっといい方法
より読みやすい別の方法はありますか?
例
2行のファイルがあるとします。最初の行には、x_1からx_nまでのn個の整数が含まれています。2行目には、1行目のグループに属するx_1 + x_2 +...x_n整数が含まれています。最初の行から整数のシーケンスを取得し、n個のパーサーp_1からp_nを作成します。ここで、p_iはx_i整数を解析します。
l = List(1,2,3)
最初の行の整数のリストがあるとします。整数ごとに、整数n
を解析するパーサーを作成しn
ますparsers = l.map(repN(_,integer))
。
parsing - バイナリ(テキストではない)ファイルを解析できる既知のパーサーコンビネーターライブラリがF#にありますか?
私はfparsecの基本のいくつかに精通していますが、テキストファイルまたはストリームを対象としているようです。
バイナリファイルを効率的に解析できる他のF#ライブラリはありますか?または、fparsecを簡単に変更して、バイナリストリームで効率的に動作するようにすることはできますか?
java - 大規模プロジェクト用の解析テクノロジの選択
さまざまなファイル形式を処理する必要があります。少なくとも50、場合によっては100以上。
過去にAntlrで遊んだことがあります。ただし、いくつかの理由から、Antlr がこのプロジェクトに適しているかどうかはわかりません。
- 文法や文法の断片を組み合わせて再利用するのは難しい
- Antlr はコード生成を行います。既存のパーサーに変更を加えるには、Antlr に戻って変更を加え、コードを再生成し、コードをコードベースに統合し、単体テストを実行する必要があります。
- ツリーの構築/処理を行うには、Antlr 内で別の言語を処理する必要があります -- 将来の開発者にとって潜在的な問題です
基本的に、私は Antlr が好きですが、やや単純な言語/形式用の 100 個のパーサーよりも、複雑な言語用の 1 つまたは 2 つのパーサーを作成するのに適していると思います。
Antlr のようなパーサー ジェネレーターに代わるものは、パーサー コンビネーターです。利点は、パーサーがコードに直接統合されているため、再利用、テスト、およびさらなる抽象化が非常に簡単になることです。また、将来の開発者は新しいツールの使い方を学ぶ必要がなくなります。パーサー・コンビネーターの欠点は、Java で使用するための強力なライブラリーを私が知らないことです。
質問は次のとおりです。
- Antlr は、このような大規模な解析プロジェクトに適していますか?
- Java で大規模な解析を行うための他のオプションは何ですか?
注: 一部のファイル形式は CSV またはタブ区切りで、一部はやや複雑で、一部は Java と同じくらい複雑です。セマンティクス的には、非常に複雑になることもあります (ただし、すべてがそうであるわけではありません)。
parsing - Scalaコンビネーターパーサー、>>はどういう意味ですか?
私はscalaの「>>」について少し混乱しています。ダニエルは、xmlを解析するScalaパーサーコンビネーターで言った?以前のパーサーからの結果に基づいてパーサーベースをパラメーター化するために使用できること。誰かが私にいくつかの例/ヒントを教えてもらえますか?私はすでにscaladocを読みましたが、それでも理解できません。
ありがとう
parsing - RegexParser のカスタム エラー
誰かが次の動作を理解するのを手伝ってくれますか:
parseAll (parseIf, "If bla blablaa")
結果はis expected
. 代わりに、私は常に取得しstring matching regex 'is\b' expected but 'b' found
ます。" If bla is blablaa"
(先頭の空白に注意してください)同じ動作になるため、空白と関係があると思います。StandardTokenParsers で試してみたところ、すべてうまくいきました。残念ながら、STP は正規表現をサポートしていません。フォローアップの質問: RegexParsers を変更して、文字のシーケンスではなく文字列のシーケンスを使用するにはどうすればよいですか? これにより、エラー報告がはるかに簡単になります。
scala - パターンマッチング時の「消去のためチェックされていません」という警告を取り除く方法
スカラ 2.8.1
QA 用のパーサー/コンビネーターを使用して受け入れテストを作成するための非常に単純な外部 DSL を実装しました。
最近、一連の式を次のようにループする機能を追加しました
warning: non variable type-argument ... is unchecked since it is eliminated by erasure
ビルド時、パターンマッチング時に警告が出ます。以下でも抽出してみました。
exprs
この警告なしでエレガントな方法で抽出するための提案はありますか? そのまま機能します。私はそれを無視する必要がありますか?警告を無視する習慣を身につけたくありません。
編集:答えてください。これは実際に私が最初に試したものでしたが、intelliJ scala プラグインが型を推測できなかったため、型を追加しました。