問題タブ [uu-parsinglib]
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.
performance - 一部のルールが有効になっていると、UU-Parsinglib が大幅に遅くなる
を使用してコンパイラを書いていuu-parsinglibますが、非常に奇妙なことがわかりました。pChoice次のようなコンビネータを定義しました。
(注意、私は greedy を使用して<<|>います)。
次のコードを考えてみましょう。
各要素は異なる文字でExpr.Var始まります - 文字、Expr.Lit数字、L.pParensed括弧(、中Expr.Tuple括弧{、Expr.List括弧で始まり[ます。
タプルもリストもない大きなテスト コードがあります。コードは で解析され0.15sます。上記の行のコメントを外すと、時間が に増加し0.65sます。これは 400% を超える速度低下です...どのように可能でしょうか? 私は貪欲な演算子のみを使用しており、コード全体にタプルもリストもないため、パーサーがセクションにTupleもハニングしていないと確信しています。List
さらにコードや定義が必要な場合は、もちろん投稿します。
parsing - パーサーコンビネータ (左再帰) を使用した関数適用を持つ式文法の解析
実際の言語のパーサーの単純化された部分問題として、標準の命令型言語 (Python、JavaScript など) に似た架空の言語の式のパーサーを実装しようとしています。その構文には、次の構造があります。
- 整数
- 識別子 (
[a-zA-Z]+) +and*と括弧を使用した算術式- を使用した構造アクセス
.(例:foo.bar.buz) - タプル (例:
(1, foo, bar.buz)) (あいまいさをなくすため、1 タプルは のように記述します(x,)) - 関数の適用 (例
foo(1, bar, buz())) - 関数はファーストクラスであるため、他の関数から返して直接適用することもできます(たとえば、関数を返す可能性がある
foo()()ため合法です)foo()
したがって、この言語のかなり複雑なプログラムは
結合性は
私は現在、非常に優れuu-parsinglibたアプリカティブ パーサー コンビネーター ライブラリを使用しています。
最初の問題は明らかに、直感的な式の文法 (が左再帰的であることです。しかし、コンビネータexpr -> identifier | number | expr * expr | expr + expr | (expr)を使用してその問題を解決できました (以下の例を参照)。pChainlparseExpr
残りの問題 (したがって、この質問) は、他の関数 ( f()()) から返された関数を使用した関数の適用です。繰り返しますが、文法は recursive のままexpr -> fun-call | ...; fun-call -> expr ( parameter-list )です。を使用してこの問題をエレガントに解決する方法はありuu-parsinglibますか? parsec(この問題は、attoparsecおよび他のパーサー コンビネーターにも直接適用されるはずです)。
以下の私の現在のバージョンのプログラムを参照してください。それはうまく機能しますが、関数の適用は識別子に対してのみ機能し、左再帰を削除します。
haskell - Parsec は uu-parsinglib で同等のものを満たしています
satisfyParsec のような機能を探しています。何かのようなもの:
私が見つけた唯一のものは、 as 引数を必要とするpSatisfyです。Insertionなぜこれが必要なのかわかりません...述語が満たされない場合にパーサーが失敗するようにしたいだけです!
どうすればこれを達成できますか?
haskell - 空の文字列入力だけを認識する UU パーサー?
空 (長さ 0) の入力でParser ()成功し (そして を返し)、他のすべての場合に失敗するtype の値が必要です。()
pSatisfy (const False)必要なことを十分に行っていません。pEndこの目的には適切とは思えません。
pExact 0 pAscii正確な「定義による」ソリューションかもしれません。まだ動作していないようです:
haskell - uu-parsinglib を使用して一連の Word8 を解析する
[Word8][Char] ではなく、uu-parsinglib を使用して操作しようとしています。(エラー報告に uu-parsinglib を使用したい。)Word8それが何であれ、シーケンスの次のものを取得するパーサーが必要です。それができたら、より複雑なパーサーを作成できます。でも、書き方が分からなくて困っています。私が得ることができた最も近いものは次のとおりです。
ただし、その実装は明らかに間違った型を返します。
の型シグネチャがどのように aではなくpSatisfya を返すように制限しているのかわからないので、これは私を驚かせます。CharWord8
どうすれば実装できpRawWord8ますか?