問題タブ [parsec]

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 に答える
2332 参照

parsing - パーセクを貪欲にどのように使用しますか?

私の仕事では、多くの厄介なSQLに出くわし、SQLを解析してきれいに出力するプログラムを作成するという素晴らしいアイデアを思いつきました。私はそれをかなり早く作りましたが、解決方法がわからない問題に遭遇しました。

それでは、SQLが「1のバーからfooを選択」であるとしましょう。私の考えでは、キーワードの後に​​データが続くので、キーワードを解析し、次のキーワードの前にすべてのジブリッシュをキャプチャして、価値がある場合は後でクリーンアップするために保存するだけです。コードは次のとおりです。

ここで重要なのはスタッフパーサーです。これは、キーワードの間にあるものであり、列リストからwhere基準まで何でもかまいません。この関数は、キーワードに至るまでのすべての文字をキャッチします。しかし、それが完了する前に何か他のものが必要です。副選択がある場合はどうなりますか?「selectid、(select product from products)frombar」。その場合、そのキーワードにヒットすると、すべてが台無しになり、解析が間違って、インデントが台無しになります。また、句に括弧を付けることもできます。

したがって、anyCharを別のコンビネータに変更する必要があります。このコンビネータは、文字を1つずつ丸呑みするだけでなく、括弧を探します。見つかった場合は、すべてをトラバースしてキャプチャします。さらに括弧がある場合は、それを実行します。括弧を完全に閉じてから、すべてを連結して返します。これが私が試したことですが、うまく機能させることができません。

これは次のようにエラーになります:

しかし、これを機能するように書き直す方法は考えられません。括弧の部分でmanyTillを使用しようとしましたが、代わりに文字列生成括弧と単一文字の両方がある場合、タイプチェックを取得するのに問題が発生します。誰かがこれについて行く方法について何か提案がありますか?

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

haskell - マッチの長さをパーセクで取得する

Parsec'sparse pattern "(some_input)" inputは、解析されたデータを返します ( pattern.

どのくらいinput消費したかを知る方法 (パターンは eof で固定されていません)。all の内部を介して長さの追跡を追加したくありませんpattern(入力の一部を破棄する場合)。

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

haskell - Parsec で Control.Monad.State を使用するには?

これに関する情報を見つけることができなかったことに驚いています。困っているのは私だけでしょう。

それで、ダッシュカウンターがあるとしましょう。文字列内のダッシュの数を数えて、文字列を返したいです。parsec の状態処理を使用すると機能しない例を挙げたふりをします。したがって、これは機能するはずです:

実際、これはコンパイルされます。さて、私はそれを使用しようとします:

わかりました、それは理にかなっています。状態と文字列を返す必要があります。涼しい。

おっとっと。しかし、そもそもどうして機能することを期待できたのでしょうか? 初期状態を入力する方法はありません。

関数もあります:

しかし、同様のエラーが発生します。

その上でrunStateを実行する必要があるか、内部で既に実行している関数が必要なように感じますが、ここからどこに行くべきかわかりません。

編集:もっと明確に指定する必要がありました.parsecの状態処理を使用したくありませんでした. その理由は、バックトラックが、解決しようとしている問題で収集するものに影響を与えたくないという気持ちがあるからです。

ただし、McCann 氏はこれをどのように組み合わせるかを考え出しており、最終的なコードは次のようになります。

どうもありがとう。

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

haskell - Parsec パーサーに readHex を追加する

私は自分でスキームを書くを行っていて、このページの演習 4 で感銘を受けました。

どうすればいいですか?readHexここまでたどり着きましたが、がどこに行くべきかまったくわかりませんliftM。パーサーの大文字と小文字を一致させますか?

<|>また、関数には適用できないと思いますよParser LispValね?

0 投票する
5 に答える
5029 参照

parsing - パーサーコンビネーターを使用するのではなく、ハッピーのようなパーサージェネレーターを使用する利点は何ですか?

文脈自由文法の書き方と構文解析の方法を学ぶために、ツールを選びたいと思います。Haskellには、2つの大きなオプションがあります。文法の説明からパーサーを生成するHappyと、Haskellでパーサーを直接コーディングできる*Parsecです。

どちらのアプローチの(不)利点は何ですか?

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

haskell - パーセクエラー-試してみても機能しないようです

現在、Text.Parsec.Exprモジュールを使用して、スクリプト言語のサブセットを解析しています。

基本的に、この言語には2種類のコマンドがあります。フォームの割り当てとフォーム$var = exprのコマンド$var = $array[$index]です。もちろん他のコマンドもありますが、これで問題を説明できます。

これを表すタイプCommandを、対応するパーサーとともに作成しました。ここexprで、割り当てはParsecのによって処理されbuildExpressionParserます。

さて、問題。最初に解析コード:

コード全体(50行)がここに貼り付けられます:リンク(parsecがインストールされている場合はコンパイルする必要があります)

assignment問題は、以前にあったとしても、正常に解析されないため、解析が失敗することtryです。解析順序(try command <|> assignment)を逆にすると問題は解決しますが、私の場合は不可能です。

もちろん、私は問題をさらに突き止めようとしましたが、問題は式パーサー(build by buildExpressionParser)であるように見えます。これは、と言うと解析が成功するためexpr = fail ""です。ただし、Parsecのソースには、この動作を説明するものは何も見つかりません。

0 投票する
5 に答える
340 参照

haskell - 2つのモナディック値をペアにして、それを返します

私はParsecで遊んでおり、2つのパーサーを1つに結合して、結果をペアにした後、別の関数をフィードして、解析結果を操作し、次のように記述します。

だから私はこれを書いた:

どこかに実装されている(<&>)に似たものはありますか?それとも、これはポイントフリーで書くことができますか?試してみfmap (,)ましたが、タイプに合わせるのが難しいようです。

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

haskell - HaskellでのFB2(XML)の解析

Haskellを学び始め、Parsecに精通することにしましたが、問題がありました。FB2の形式で本の解析を実装しようとしています。従来のタグ(テキスト)では問題ありませんが、タグ内のタグが機能しない場合。

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

parsing - Is it possible to express chainl1 using applicative?

Is it possible to express the chainl1 combinator from Parsec not using the Monad instance defined by parsec?

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

haskell - レクサーを書くためのhaskellEDSLはありますか?

レクサーフェーズと解析フェーズを1つのフェーズに混在させると、Parsecパーサーが読みにくくなるだけでなく、速度が低下することがあります。1つの解決策は、Alexをトークナイザーとして使用し、次にParsecをトークンストリームのパーサーとして使用することです。

これは問題ありませんが、コンパイルパイプラインに前処理フェーズが1つ追加されたり、haskellの「IDE」とうまく統合されなかったりするため、Alexを取り除くことができればさらに良いでしょう。アレックスのスタイルで、しかしライブラリとして、トークナイザーを記述するためのhaskellEDSL。