問題タブ [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.
parsing - パーセクを貪欲にどのように使用しますか?
私の仕事では、多くの厄介なSQLに出くわし、SQLを解析してきれいに出力するプログラムを作成するという素晴らしいアイデアを思いつきました。私はそれをかなり早く作りましたが、解決方法がわからない問題に遭遇しました。
それでは、SQLが「1のバーからfooを選択」であるとしましょう。私の考えでは、キーワードの後にデータが続くので、キーワードを解析し、次のキーワードの前にすべてのジブリッシュをキャプチャして、価値がある場合は後でクリーンアップするために保存するだけです。コードは次のとおりです。
ここで重要なのはスタッフパーサーです。これは、キーワードの間にあるものであり、列リストからwhere基準まで何でもかまいません。この関数は、キーワードに至るまでのすべての文字をキャッチします。しかし、それが完了する前に何か他のものが必要です。副選択がある場合はどうなりますか?「selectid、(select product from products)frombar」。その場合、そのキーワードにヒットすると、すべてが台無しになり、解析が間違って、インデントが台無しになります。また、句に括弧を付けることもできます。
したがって、anyCharを別のコンビネータに変更する必要があります。このコンビネータは、文字を1つずつ丸呑みするだけでなく、括弧を探します。見つかった場合は、すべてをトラバースしてキャプチャします。さらに括弧がある場合は、それを実行します。括弧を完全に閉じてから、すべてを連結して返します。これが私が試したことですが、うまく機能させることができません。
これは次のようにエラーになります:
しかし、これを機能するように書き直す方法は考えられません。括弧の部分でmanyTillを使用しようとしましたが、代わりに文字列生成括弧と単一文字の両方がある場合、タイプチェックを取得するのに問題が発生します。誰かがこれについて行く方法について何か提案がありますか?
haskell - マッチの長さをパーセクで取得する
Parsec'sparse pattern "(some_input)" input
は、解析されたデータを返します ( pattern
.
どのくらいinput
消費したかを知る方法 (パターンは eof で固定されていません)。all の内部を介して長さの追跡を追加したくありませんpattern
(入力の一部を破棄する場合)。
haskell - Parsec で Control.Monad.State を使用するには?
これに関する情報を見つけることができなかったことに驚いています。困っているのは私だけでしょう。
それで、ダッシュカウンターがあるとしましょう。文字列内のダッシュの数を数えて、文字列を返したいです。parsec の状態処理を使用すると機能しない例を挙げたふりをします。したがって、これは機能するはずです:
実際、これはコンパイルされます。さて、私はそれを使用しようとします:
わかりました、それは理にかなっています。状態と文字列を返す必要があります。涼しい。
おっとっと。しかし、そもそもどうして機能することを期待できたのでしょうか? 初期状態を入力する方法はありません。
関数もあります:
しかし、同様のエラーが発生します。
その上でrunStateを実行する必要があるか、内部で既に実行している関数が必要なように感じますが、ここからどこに行くべきかわかりません。
編集:もっと明確に指定する必要がありました.parsecの状態処理を使用したくありませんでした. その理由は、バックトラックが、解決しようとしている問題で収集するものに影響を与えたくないという気持ちがあるからです。
ただし、McCann 氏はこれをどのように組み合わせるかを考え出しており、最終的なコードは次のようになります。
どうもありがとう。
haskell - Parsec パーサーに readHex を追加する
私は自分でスキームを書くを行っていて、このページの演習 4 で感銘を受けました。
どうすればいいですか?readHex
ここまでたどり着きましたが、がどこに行くべきかまったくわかりませんliftM
。パーサーの大文字と小文字を一致させますか?
<|>
また、関数には適用できないと思いますよParser LispVal
ね?
parsing - パーサーコンビネーターを使用するのではなく、ハッピーのようなパーサージェネレーターを使用する利点は何ですか?
文脈自由文法の書き方と構文解析の方法を学ぶために、ツールを選びたいと思います。Haskellには、2つの大きなオプションがあります。文法の説明からパーサーを生成するHappyと、Haskellでパーサーを直接コーディングできる*Parsecです。
どちらのアプローチの(不)利点は何ですか?
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のソースには、この動作を説明するものは何も見つかりません。
haskell - 2つのモナディック値をペアにして、それを返します
私はParsecで遊んでおり、2つのパーサーを1つに結合して、結果をペアにした後、別の関数をフィードして、解析結果を操作し、次のように記述します。
だから私はこれを書いた:
と
どこかに実装されている(<&>)に似たものはありますか?それとも、これはポイントフリーで書くことができますか?試してみfmap (,)
ましたが、タイプに合わせるのが難しいようです。
haskell - HaskellでのFB2(XML)の解析
Haskellを学び始め、Parsecに精通することにしましたが、問題がありました。FB2の形式で本の解析を実装しようとしています。従来のタグ(テキスト)では問題ありませんが、タグ内のタグが機能しない場合。
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?
haskell - レクサーを書くためのhaskellEDSLはありますか?
レクサーフェーズと解析フェーズを1つのフェーズに混在させると、Parsecパーサーが読みにくくなるだけでなく、速度が低下することがあります。1つの解決策は、Alexをトークナイザーとして使用し、次にParsecをトークンストリームのパーサーとして使用することです。
これは問題ありませんが、コンパイルパイプラインに前処理フェーズが1つ追加されたり、haskellの「IDE」とうまく統合されなかったりするため、Alexを取り除くことができればさらに良いでしょう。アレックスのスタイルで、しかしライブラリとして、トークナイザーを記述するためのhaskellEDSL。