Содержание
- 2. Синтаксический анализ Задачи: Проверка правильности исходных данных - соответствие текста грамматике Содержательная обработка исходных данных
- 3. Подходы Полностью ручная реализация Генераторы парсеров (YACC, Happy) Комбинаторные библиотеки “List of successes” Монадические Parsec
- 4. Монадические парсеры type Parser a return :: a -> Parser a (>>=) :: Parser a ->
- 5. Parsec import Text.ParserCombinators.Parsec simple :: Parser Char simple = letter > parseTest simple “a” ‘a’ Примитивные
- 6. Последовательность парсеров bracketedLetter :: Parser Char bracketedLetter = do { char ‘(‘ ; c ; char
- 7. Последовательность парсеров > parseTest bracketedLetter “(a)” ‘a’ > parseTest bracketedLetter “(ab)” parse error at (line 1,
- 8. Альтернативы parens :: Parser () parens = do { char ‘(‘ ; parens ; char ‘)’
- 9. Предпросмотр test1 = string “OCaml” string “Haskell” test2 = string “(lisp)” string “(scheme)” > parseTest test1
- 10. Предпросмотр test1 = string “OCaml” string “Haskell” test2 = string “(lisp)” string “(scheme)” > parseTest test2
- 11. Предпросмотр Причина: Parsec строит LL(1)-парсер Ограничение: решение принимается на основании анализа только первого символа строки Осознанный
- 12. Предпросмотр Вариант 1: test2 = do { char ‘(‘ ; s string “scheme” ; char ‘)’
- 13. Предпросмотр Вариант 2: test2 = try (string “(lisp)”) string “(scheme)” Комбинатор try так изменяет наш парсер,
- 14. Архитектурные принципы Эффективность: отказ от затрат на поддержку неограниченного предпросмотра, LL(1) по умолчанию, можно увеличить количество
- 15. Ограничение предпросмотра В конструкции p q парсер q в принципе не вызывается, если p обработал больше
- 16. Ограничение предпросмотра Упрощенная реализация: type Parser a = String -> Consumed a data Consumed a =
- 17. Базовые комбинаторы return x = \input -> Empty (Ok x input) satisfy :: (Char -> Bool)
- 18. Базовые комбинаторы char c = satisfy (==c) letter = satisfy isAlpha digit = satisfy isDigit
- 19. Базовые комбинаторы (>>=) :: Parser a -> (a -> Parser b) -> Parser b p >>=
- 20. Базовые комбинаторы Consumed reply1 -> Consumed (case (reply1) of Ok x rest -> case ((f x)
- 21. Базовые комбинаторы ( ) :: Parser a -> Parser a -> Parser a p q =
- 22. try try :: Parser a -> Parser a try p = \input -> case (p input)
- 23. Обработка ошибок К типу Parser добавляется состояние: type Parser a = State -> Consumed a data
- 24. Обработка ошибок Меняется реализация return, satisfy, ( ) – [Leijen, Meijer, 2001] В результате получаем возможность
- 25. Семантика nesting :: Parser Int nesting = do { char ‘(‘ ; n ; char ‘)’
- 26. Дополнительные возможности Лексический анализ: Лексический анализ объединяется с синтаксическим анализом Лексический анализ выполняется отдельными специализированными парсерами
- 28. Скачать презентацию