Есть ли библиотека комбинаторов синтаксических анализаторов, которая дает производительность, сопоставимую с Happy / Alex?
Я знаю об Attoparsec, но иногда она работает не очень хорошо, как в примере ниже:
isToken c = isLetter c || isDigit c
symbol :: Parser Expr
symbol = do
c <- skipSpace >> satisfy isLetter
rest <- takeWhile isToken
let token = C.cons c rest -- oops... O(N)
error $ show token
Обходной путь довольно уродлив:
do { skipSpace; bs <- scan go True; when (null bs) (fail "Not a symbol"); return bs}
where go True c = if isLetter c then Just False else Nothing
go False c = if isToken c then Just Fasle else Nothing
Кроме того, Attoparsec не хватает обработки ошибок.
Happy / Alex довольно недружелюбны (для меня) по сравнению с ocamlyacc / ocamllex, BNFC негибкий ив моем случае требуется дополнительный обход AST после разбора.Кроме того, обработка ошибок не очень хороша.
Существует три варианта отдыха: Parsec2, Parsec3 и uu-parselib.Я обнаружил ряд противоречивых тестов, предполагая, что Parsec2 быстрее, чем Parsec3, или UU быстрее, или медленнее.
Но что выбрать?У кого-нибудь есть опыт использования uu-parselib?Мне нужен синтаксический анализатор для какого-то DSL, нужен достаточно быстрый анализ, чтобы не менять его в будущем.