我正在使用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.65s
或Tuple
部分,因为在整个代码中没有元组也没有列表。
如果您需要更多代码或定义,我当然会提出它。
答案 0 :(得分:1)
我认为事情的原因可能在于您已经参数化了pFactor。这将导致对这样的解析器的每次调用都构建一个新的解析器,这将花费时间。最好一次创建这样的解析器并在实际的解析过程中共享它们。我无法看到您如何使用此解析器我无法再回答您的问题。