启用某些规​​则后,UU-Parsinglib会大幅减速

时间:2013-12-31 05:43:28

标签: performance parsing haskell parsec uu-parsinglib

我正在使用uu-parsinglib编写编译器,我看到了一个非常奇怪的事情。我定义了一个pChoice组合器,如:

pChoice    = foldr (<<|>) pFail

(注意,我正在使用贪婪的<<|>)。

让我们考虑以下代码:

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加括号{ {1}}和{括号Expr.List

我有一个很大的测试代码,其中没有元组,没有列表。代码在[中解析。当我取消注释上述行时,时间会增加到0.15s。这超过400%放缓......怎么可能?我只使用贪婪的运算符,我确信解析器不在0.65sTuple部分,因为在整个代码中没有元组也没有列表。

如果您需要更多代码或定义,我当然会提出它。

1 个答案:

答案 0 :(得分:1)

我认为事情的原因可能在于您已经参数化了pFactor。这将导致对这样的解析器的每次调用都构建一个新的解析器,这将花费时间。最好一次创建这样的解析器并在实际的解析过程中共享它们。我无法看到您如何使用此解析器我无法再回答您的问题。