問題タブ [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.
parsing - regex および Scala パーサー コンビネーターを使用して複雑な言語を解析できない
研究の一環として、特定の言語のパーサーを作成しようとしています。現在、次のコードを希望どおりに動作させるのに問題があります。
上記のコードには、言語の一部しか含まれていません。時間とスペースを節約するために、言語全体の詳細にはあまり触れません。_uw メソッドは、最初の部分だけが文字列に存在する必要がありますが、3 つの部分で構成される文字列を解析することになっています。
_uw は、これらのテスト文字列を正しく解析できるはずです。
したがって、見出し語が で始まり で終わる場合、"
二重引用符内のすべてが見出し語の一部と見なされます。で始まるすべての単語.@
は、二重引用符で囲まれていない場合、見出し語の属性です。
test5.
たとえば、test5 では、パーサーは見出し語およびattr
属性として解析する必要があります。.@ だけを省略し、その前のすべてのドットを見出しに含める必要があります。
したがって、見出しの後には、属性や修飾子を含めることができます。順序は厳密であるため、属性は常に修飾子の後に続きます。属性はあるが修飾子がない場合は、それまでのすべて.@
が見出し語の一部と見なされます。
主な問題は"[^@(]*".r
. など、あらゆる種類のクリエイティブな代替手段を試しまし"(^[\\w\\.]*)((\\.\\@)|$)".r
たが、何も機能しないようです。先読みや後読みはパーサーコンビネータにどのように影響しますか? 私は解析や正規表現の専門家ではないので、どんな助けも歓迎します!
scala - パーサーコンビネーター: repsep はバックトラッキングを許可しますか?
次のようなパーサーの例を考えてみましょう:
この入力を解析しようとすると (2 行が含まれていない場合、exclude は正常に動作します):
次のエラーが表示されます。
問題は次の行で明らかです。
うまくいかない理由とは。バックトラックと何か関係がありますか?それを機能させるには、どのような代替手段が必要ですか?
f# - FParsec識別子とキーワード
キーワードを含む言語の場合、たとえば「if」が識別子として解釈されないようにし、「ifSomeVariableName」がトークンストリームでキーワード「if」の後に識別子「SomeVariableName」になるのを防ぐために、特別なトリックが必要です。
再帰下降とLex/Yaccについては、レクサーとパーサーの間でトークンストリームを変換するというアプローチを(役立つ指示に従って)単純に採用しました。
ただし、FParsecは実際には別のレクサーステップを実行していないように見えるので、これに対処するための最良の方法は何であるか疑問に思います。と言えば、HaskellのParsecはレクサーレイヤーをサポートしているようですが、FParsecはサポートしていませんか?
scala - elem メソッドの前にある空白の解析
2 つの Int といくつかの要素と末尾の入力を解析しようとしました。
メソッド に入力例を示しますgo
。Int と末尾の要素は、スペースで区切る必要があります。ただし、これは Int に対してのみ機能し、要素に対しては機能しません。入力すると
次のエラーが表示されます。
しかし、私が入力すると
私は得る:
最後に、私はParser[Int ~ Int ~ List[List[Char]]]
. 前に空白を挿入しても機能しないのはなぜelem
ですか? そして、どうすればこのコードを機能させることができますか?
f# - FParsec リアクティブの例
データがある種の着信ライブ ストリームに基づいている FParsec の使用例を誰かが潜在的に投稿できることを期待しています。
いくつかの例としては、マウス ジェスチャに基づいて結果を生成したり、特定の株価ティック シーケンスに基づいてアラートまたは通知を生成したりできます。
誰かが例を投稿できれば、それは大歓迎です。
ありがとう!
scala - Scalaのパーサーコンビネーターを使用するときに、一致しない先行テキストを無視するにはどうすればよいですか?
私はパーサーコンビネーターが本当に好きですが、関連するテキストの前のテキストを気にしないときにデータを抽出するために思いついたソリューションには満足していません。
金額を取得するには、この小さなパーサーを検討してください。
ご覧のとおりAmount
、パーサーに有効なデータで始まる文字列を指定すると、簡単にsを取り戻すことができます。
ただし、その前に一致しないテキストがある場合は失敗します。
私の解決策はamountNested
パーサーであり、再帰的にを見つけようとしますAmount
。これは機能しますが、次のようになりますParseResult[Any]
。
この型情報の喪失(もちろん、パターンマッチングを使用して「取得」できます)は、成功には。が含まれるため、残念ながら思われますAmount
。
"I have 101.41 EUR"
一致するかどうかにかかわらず、入力()を検索し続ける方法はありParser[Any]
ますか?
ScalaDocsを見ると、*
上のメソッドが役立つように見えますが、次のParser
ようなことを試してみると、失敗または無限ループしか発生しません。
parsing - 文字を含む文字列の解析
私はフォローを機能させようとしています。かっこで囲まれた文字列があります。文字列には任意の文字を含めることができるため、解析する文字列にも括弧を含めることができます。正規表現は現在、<〜 ")"が一致するはずの最後の括弧にも一致しているため、解析は失敗すると思います。ここで何が欠けていますか?
これは、次の種類の文字列を解析することになっています。
したがって、「a」パーサーは、括弧または。@attr部分が開くまで文字列を解析します。「b」パーサーは、オプションの括弧内の文字を解析します。「c」はオプションの。@attrsを解析します。
現在、括弧部分を含むすべてのテスト文字列で同様のエラーが発生します。
したがって、パーサーは最初の部分を正しく解析したと思いますが、括弧の部分を見ると失敗しました。
parsing - Scalaマップパーサー
Map入力を受け取りCaseクラスを出力できるパーサーを構築したいと思います。現在、FPを利用していないように見える命令型コードがいくつかあります。Caseクラスを出力できるパーサーを構築する方法がわかりません。
これが私が持っているものです:
更新: 私はAnormに似た何かをしたいが、スカラのパーサーコンビネーターを使って何かをしたいということをもっと明確にすべきだったと思います。上記の問題は、柔軟性や再利用性がないことです。発信者は、取得したものだけを取得する必要があります。
パーサーコンビネーターがマップ形式の結果を解析するための正しいアプローチになることを願っています。ご想像のとおり、私はDyanmoDBを使用しています。
更新2: どうやら私は問題をうまく説明することができません。私がやりたいのは、呼び出し元が指定したバインディングを使用して、呼び出し元が選択したCaseクラスにマップを変換できる1つ以上のPareserCombinatorを作成することです。入力マップ=>出力ケースクラス
更新3: https ://github.com/wfaler/scala-dynamoは面白そうに見えますが、パーサーコンビネーターを使用していません。
parsing - パーサーコンビネーターを使用した Scala 文の解析
以下のようなステートメントを効果的に解析する方法 (コードが乱雑にならないようにする方法)。キーワード/セパレーターは [] 内に配置されます。
Manager, Delhi [for] The Company Pvt Ltd. [from] 2009 年 1 月 [to] 2012 年 1 月。
構文解析コンビネータを使用して、テキストから人名、会社名、および日付範囲を抽出します。(期待される出力は下部に表示されます)
以下は、上記のために書かれたコードです-
出力は次のようになります
また、上記のテキストに表示される不要な「〜」を削除する方法。
ありがとう、パワン
regex - パーサーコンビネーターを使用してテキスト行を照合する
パーサーコンビネーターを使用してテキストファイルを解析しようとしています。というクラスでインデックスとテキストをキャプチャしたいと思いますExample
。入力ファイルのフォームを示すテストは次のとおりです。
そして、これがうまくいかない私の試みです:
それは失敗します:
私はこれらから始めたばかりなので、私が何をしているのかあまりわかりません。".*".r
問題は、正規表現が複数行を実行していないことにあると思います。正しく解析されるようにこれを変更するにはどうすればよいですか?