UU-Parsinglib резко замедляется при включении некоторых правил
Я пишу компилятор, используя 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
раздел, потому что во всем коде нет ни кортежа, ни списка.
Если вам понадобится больше кода или определений, я, конечно, отправлю его.
1 ответ
Я думаю, что причина этого может заключаться в том, что вы параметризовали pFactor. Это приведет к тому, что каждый вызов такого анализатора будет создавать новый анализатор, что займет время. Гораздо лучше создать такие парсеры раз и навсегда и делиться ими в реальном процессе анализа. Я не могу понять, как вы используете этот парсер, я не могу больше отвечать на ваши вопросы.