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

Другие вопросы по тегам