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% 的减速……这怎么可能?我只使用了贪婪的运算符,而且我确信解析器不会在TuplenorList部分中使用,因为在整个代码中没有元组或列表。

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

4

1 回答 1

2

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

于 2014-01-19T00:54:34.917 回答