我正在用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以括号{开头,Expr.List以括号[开头。
我有一个很大的测试代码,其中没有元组和列表。代码在0.15s中解析。当我取消对上面几行的注释时,时间会增加到0.65s。这是400%的减速...这怎么可能呢?我只使用贪婪的运算符,我确信解析器不会处理Tuple或List部分,因为在整个代码中既没有元组也没有列表。
如果您需要更多代码或定义,我当然会将其发布。
发布于 2014-01-19 08:54:35
我认为问题的原因可能在于您对pFactor进行了参数化。这将导致每次调用这样的解析器来构建一个新的解析器,这将需要时间。最好一劳永逸地创建这样的解析器,并在实际的解析过程中共享它们。我不知道你是如何使用这个解析器的,我不能再回答你的问题了。
https://stackoverflow.com/questions/20852392
复制相似问题