Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Developing Compiler

Developing Compiler

OdHUG 2015 April MeetUp

Sergey Bushnyak

April 30, 2015
Tweet

More Decks by Sergey Bushnyak

Other Decks in Programming

Transcript

  1. Зачем изучать компиляторы? • Полезно знать инструменты, которыми пользуешься. Понимать

    вывод компилятора • Техники и алгоритмы используемые при разработке компилятора можно применять в других областях • Большой шанс, что вам прийдется писать компилятор для DSL или мета-языка
  2. Виды ошибок • Лексические – Неправильное название идентификатора • Синтаксические

    – Отсутствует ; или другой разделитель – Неправильные отступы • Семантические – Неправильное присвоение • Логические – Бесконечный цикл
  3. Интерпретация • анализирует и тут же выполняет программу • Не

    гененирует машинный код • Программа выполняется только при наличии интерпретатора
  4. Лексический анализ. 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" Категории лексем
  5. Лексический анализ. BNF <program> ::= PROGRAM <declarations> BEGIN <statementSequence> END

    <declarations> ::= VAR ident AS <type> SC <declarations> | ε <type> ::= INT | BOOL <statementSequence> ::= <statement> SC <statementSequence> | ε <statement> ::= <assignment> | <ifStatement> | <whileStatement> <assignment> ::= ident ASGN <expression> | ident ASGN READINT <ifStatement> ::= IF <expression> THEN <statementSequence> <elseClause> END <elseClause> ::= ELSE <statementSequence> | ε <whileStatement> ::= WHILE <expression> DO <statementSequence> END <writeInt> ::= WRITEINT <expression> <expression> ::= <simpleExpression> | <simpleExpression> COMPARE <expression> <simpleExpression> ::= <term> ADDITIVE <simpleExpression> | <term> <term> ::= <factor> MULTIPLICATIVE <term> | <factor> <factor> ::= ident | num | boollit | LP <expression> RP
  6. Лексический анализ. Прямой разбор • Дробление строки по пробелу •

    Регэкспы • Парсер-комбинаторы • Конечный автомат • …(ваш вариант)
  7. Лексический анализ Где можно использовать еще? • Pretty-printers (красивый вывод

    кода) • Линтинг (статический анализ кода) • Разбор данных Лексер – это очень простой парсер
  8. VHDL. Внешний вид • EBNF грамматика стандарта 2002 - 62

    страницы • Мощный императивный язык
  9. VHDL. Zephyrus • Alex - разбитие кода на лексемы •

    Happy – несколько разных парсеров • .. • Profit
  10. VHDL.Проблематика • Анализ кодовой базы выявил ~ 300 случаев неконсистетности

    грамматики, исследовательские группы ~ 800 случаев • Недостаточно сильная система типов • Выявление критически ошибок на этапах симуляции
  11. VHDL. Zephyrus • Alex - разбитие кода на лексемы •

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