問題タブ [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)
を使用してその問題を解決できました (以下の例を参照)。pChainl
parseExpr
残りの問題 (したがって、この質問) は、他の関数 ( f()()
) から返された関数を使用した関数の適用です。繰り返しますが、文法は recursive のままexpr -> fun-call | ...; fun-call -> expr ( parameter-list )
です。を使用してこの問題をエレガントに解決する方法はありuu-parsinglib
ますか? parsec
(この問題は、attoparsec
および他のパーサー コンビネーターにも直接適用されるはずです)。
以下の私の現在のバージョンのプログラムを参照してください。それはうまく機能しますが、関数の適用は識別子に対してのみ機能し、左再帰を削除します。
haskell - Parsec は uu-parsinglib で同等のものを満たしています
satisfy
Parsec のような機能を探しています。何かのようなもの:
私が見つけた唯一のものは、 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ではなくpSatisfy
a を返すように制限しているのかわからないので、これは私を驚かせます。Char
Word8
どうすれば実装できpRawWord8
ますか?