I'm writing a compiler using uu-parsinglib
and I saw a very strange thing. I defined a pChoice
combinator like:
pChoice = foldr (<<|>) pFail
(notice, I'm using greedy <<|>
).
Lets consider following code:
pFactor i = pChoice [ Expr.Var <$> pVar
, Expr.Lit <$> pLit True
, L.pParensed (pExpr i)
-- , Expr.Tuple <$> pTuple (pOpE i)
-- , Expr.List <$> pLst (pListE i)
]
Each element starts with different character - Expr.Var
starts with a letter, Expr.Lit
with a number, L.pParensed
with parenthesis (
, Expr.Tuple
with brace {
and Expr.List
with bracket [
.
I've got a big test code in which there are no tuples and no lists. The code parses in 0.15s
. When I uncomment the above lines, the time increases to 0.65s
. This is over 400% slowdown... How is it possible? I'm using only greedy operators and I'm sure parser is not haning in Tuple
nor List
section, because in the whole code there is no tuple nor list.
If you would need more code or definitions, I'll of course poste it.