を使用してコンパイラを書いてい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
さらにコードや定義が必要な場合は、もちろん投稿します。