Slide 1

Slide 1 text

Разработка компилятора на Haskell @Sigrlami http://sigrlami.eu/ru/content/articles/writing-compiler-1.html

Slide 2

Slide 2 text

Что такое компилятор?

Slide 3

Slide 3 text

Зачем изучать компиляторы? ● Полезно знать инструменты, которыми пользуешься. Понимать вывод компилятора ● Техники и алгоритмы используемые при разработке компилятора можно применять в других областях ● Большой шанс, что вам прийдется писать компилятор для DSL или мета-языка

Slide 4

Slide 4 text

Идеализированный компилятор

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Идеализированный компилятор ● Проход (Pass) ● Фаза (Phase)

Slide 8

Slide 8 text

Идеализированный компилятор Анализ

Slide 9

Slide 9 text

Идеализированный компилятор Синтез

Slide 10

Slide 10 text

Виды ошибок ● Лексические – Неправильное название идентификатора ● Синтаксические – Отсутствует ; или другой разделитель – Неправильные отступы ● Семантические – Неправильное присвоение ● Логические – Бесконечный цикл

Slide 11

Slide 11 text

Интерпретация ● анализирует и тут же выполняет программу ● Не гененирует машинный код ● Программа выполняется только при наличии интерпретатора

Slide 12

Slide 12 text

Лексический анализ ● Преобразование исходного кода в лексемы (token) ● Поиск лексических ошибок

Slide 13

Slide 13 text

Лексический анализ. BNF ● Метаязык описания ● Описание контекстно-свободных грамматик

Slide 14

Slide 14 text

Лексический анализ. BNF Цифры, Литералы, Идентификаторы num = [1-9][0-9]*|0 boollit = false|true ident = [A-Z][A-Z0-9]* Символы и Операторы LP = "(" RP = ")" ASGN = ":=" SC = ";" MULTIPLICATIVE = "*" | "div" | "mod" ADDITIVE = "+" | "-" COMPARE = "=" | "!=" | "<" | ">" | "<=" | ">=" Ключевые слова IF = "if" THEN = "then" ELSE = "else" BEGIN = "begin" END = "end" WHILE = "while" DO = "do" PROGRAM = "program" VAR = "var" AS = "as" INT = "int" BOOL = "bool" Категории лексем

Slide 15

Slide 15 text

Лексический анализ. BNF ::= PROGRAM BEGIN END ::= VAR ident AS SC | ε ::= INT | BOOL ::= SC | ε ::= | | ::= ident ASGN | ident ASGN READINT ::= IF THEN END ::= ELSE | ε ::= WHILE DO END ::= WRITEINT ::= | COMPARE ::= ADDITIVE | ::= MULTIPLICATIVE | ::= ident | num | boollit | LP RP

Slide 16

Slide 16 text

Лексический анализ Какие есть варианты для разбития кода на лексемы?

Slide 17

Slide 17 text

Лексический анализ. Прямой разбор ● Дробление строки по пробелу ● Регэкспы ● Парсер-комбинаторы ● Конечный автомат ● …(ваш вариант)

Slide 18

Slide 18 text

Лексический анализ. Автоматизация ● Lex ● GNU/ Flex ● JavaCC ● Alex (Haskell)

Slide 19

Slide 19 text

Лексический анализ. Автоматизация

Slide 20

Slide 20 text

Лексический анализ Где можно использовать еще? ● Pretty-printers (красивый вывод кода) ● Линтинг (статический анализ кода) ● Разбор данных Лексер – это очень простой парсер

Slide 21

Slide 21 text

Синтаксический анализ ● Преобразование лексем в синтаксическое дерево AST (abstract syntax tree) ● Поиск синтаксичеcких ошибок

Slide 22

Slide 22 text

Синтаксический анализ

Slide 23

Slide 23 text

Синтаксический анализ ● Нетерминалы ● Терминалы ● Произведения

Slide 24

Slide 24 text

Синтаксический анализ. Top down Рекурсивный спуск

Slide 25

Slide 25 text

Синтаксический анализ. Bottom up

Slide 26

Slide 26 text

Синтаксический анализ.Автоматизация ● Yacc ● Bison ● Happy (Haskell)

Slide 27

Slide 27 text

Синтаксический анализ

Slide 28

Slide 28 text

VHDL Цифровая электроника ● FPGA ● ASIC ● Микропроцессоры

Slide 29

Slide 29 text

VHDL. Внешний вид ● EBNF грамматика стандарта 2002 - 62 страницы ● Мощный императивный язык

Slide 30

Slide 30 text

VHDL. Zephyrus ● Alex - разбитие кода на лексемы ● Happy – несколько разных парсеров ● .. ● Profit

Slide 31

Slide 31 text

VHDL.Проблематика ● Анализ кодовой базы выявил ~ 300 случаев неконсистетности грамматики, исследовательские группы ~ 800 случаев ● Недостаточно сильная система типов ● Выявление критически ошибок на этапах симуляции

Slide 32

Slide 32 text

VHDL. Zephyrus ● Alex - разбитие кода на лексемы ● Happy – несколько разных парсеров ● Свой лексер (модернизировать алгоритмику) ● Свой парсер (увеличить гибкость) https://github.com/sigrlami/zephyrus

Slide 33

Slide 33 text

Ключевых преимуществ Haskell ● Аппликативные функторы <*> ● Обощенные Алгебраические типы данных (GADT) ● Паттерн-матчинг АТД

Slide 34

Slide 34 text

Синтаксический анализ ● Необходимо понимать контекст ● Необходимо выявлять неконсистеность в VHDL

Slide 35

Slide 35 text

Аттрибутные граматики Добавляем дополнительный контекст к произведениям, описать свойство или взаимосвязь