我正在编写一个编译器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
norList
部分中使用,因为在整个代码中没有元组或列表。
如果您需要更多代码或定义,我当然会发布它。