Библиотека Parser Combinators по выбору (haskell) - PullRequest
7 голосов
/ 19 июля 2011

Есть ли библиотека комбинаторов синтаксических анализаторов, которая дает производительность, сопоставимую с 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, нужен достаточно быстрый анализ, чтобы не менять его в будущем.

1 Ответ

7 голосов
/ 19 июля 2011
  1. Существует еще одна альтернатива: полипарс.

  2. После прошлогодней GSoC, parsec3 был оптимизирован и теперь не заметно заметно медленнее, чем parsec2

  3. Пару лет назад я провел тесты на нескольких грамматиках (среднего размера) и обнаружил, что производительность happy / alex, parsec2 / alex, parsec2 и polyparse очень близка. Аттопарсек был быстрее в байтовых потоках, но мне нужен был многобайтовый.

Мой совет: взгляните на то, как альтернативы обрабатывают внутреннее и пользовательское состояние и сообщают об ошибках, и выбирайте по этим критериям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...