3

を使用してコンパイラを書いていuu-parsinglibますが、非常に奇妙なことがわかりました。pChoice次のようなコンビネータを定義しました。

pChoice    = foldr (<<|>) pFail

(注意、私は greedy を使用して<<|>います)。

次のコードを考えてみましょう。

pFactor i = pChoice [ Expr.Var    <$> pVar
                    , Expr.Lit    <$> pLit True
                    , L.pParensed (pExpr i)
                    -- , Expr.Tuple  <$> pTuple (pOpE i)
                    -- , Expr.List   <$> pLst   (pListE i)
                    ]

各要素は異なる文字でExpr.Var始まります - 文字、Expr.Lit数字、L.pParensed括弧(、中Expr.Tuple括弧{Expr.List括弧で始まり[ます。

タプルもリストもない大きなテスト コードがあります。コードは で解析され0.15sます。上記の行のコメントを外すと、時間が に増加し0.65sます。これは 400% を超える速度低下です...どのように可能でしょうか? 私は貪欲な演算子のみを使用しており、コード全体にタプルもリストもないため、パーサーがセクションにTupleもハニングしていないと確信しています。List

さらにコードや定義が必要な場合は、もちろん投稿します。

4

1 に答える 1

2

問題の原因は、pFactor をパラメーター化したことにあると思います。これにより、そのようなパーサーを呼び出すたびに新しいパーサーが構築されますが、これには時間がかかります。そのようなパーサーを一度だけ作成し、実際の解析プロセスで共有する方がはるかに優れています。このパーサーをどのように使用しているのかわかりません。これ以上質問に答えることができません。

于 2014-01-19T00:54:34.917 に答える