問題タブ [megaparsec]
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 - この正規表現を混乱させずに Megaparsec パーサーに変換するにはどうすればよいですか?
次の正規表現を検討してください。
で実行するとfoo/bar/baz=one,two
、一致し、サブグループがキャプチャされone
ます。で実行するとfoo/bar/baz/bar/baz=three,four,five
、一致し、サブグループがキャプチャされthree,four
ます。
regex-applicative
これをパーサーまたはパーサーに変換する方法を知っていますReadP
:
そして、どちらも私が望むように機能します。しかし、それを Megaparsec に直接音訳しようとすると、うまくいきません。
これは、Megaparsec がデフォルトでバックトラックしないことに起因することを知っています。さまざまな場所に貼り付けてこれを修正しようとしましtry
たが、うまくいきませんでした。最終的に、私はこの怪物notFollowedBy
を働かせるようになりました:
しかし、それは混乱のように見えます!特に、パターンの大部分を実質的に 2 回指定しなければならなかったことは好ましくありません。^foo/(?:[^=/]|/(?!baz=))+/baz=((?:.(?![^,]*$))*),[^,]*$
そして技術的には、それは私の最初の正規表現ではなく、 regex と同等ではないでしょうか? そのパーサーを書くためのより良い方法が必要です。どうすればいいのですか?
編集:私もこの方法で試しましたが、これも機能します(いいえ、間違って受け入れますfoo//baz=,
):
ただし、それは同じように面倒に見えますmanyTill
。つまり、正規表現に実際にマップされていないことを意味します。
haskell - stack runghc と stack ghci Haskell によって生成される異なる結果
Megaparsec を使用してパーサーを作成しています。基本的に、メイン ファイルはファイルのコンテンツを開いて読み取り、そのコンテンツを解析します。ghci でメイン ファイルを実行すると、すべてが正しく生成されました img-1
しかし、stack runghc -- app/Main.hs を使用して Main ファイルを実行しようとすると、奇妙な解析エラーが発生しました: img-2
GitHub のプロジェクトは次のとおりです: https://github.com/phuongduyphan/dbml-parser-haskell
sb を見て、私が間違っていることを教えてもらえますか? 同じ main 関数を実行すると、 stack ghci と stack runghc からの出力が異なるのはなぜですか?
haskell - パーサーコンビネーター (makeExprParser) ライブラリを介して関数呼び出し後にフィールドアクセスを正しく解析する方法は?
次のような式を解析したい: a().x
. のようになりますEAttrRef (EFuncCall (EVarRef "a") []) "x"
。残念ながら、式パーサーがすぐに停止してしまいます。解析しa()
てから停止するだけです。
コード:
デバッグ出力:
(インデックスアクセスのデバッグ出力がどのように見えるかと比較して)2回目makeExprParser
は呼び出されていないように思えますが、そうでない理由はわかりません。opFuncCall
優先順位を下げると解析されopAttrRef
ますが、間違ったツリーが生成されます (たとえば、正しいオペランドはx.a()
どちらa()
が間違っているか、そうである必要がa
あり、全体が関数呼び出しにある必要があります)、それを使用することはできません (私はかなりその言語の参照に基づいているため、現在の優先度が正しいことを確認してください)。