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

Developing Compiler

Developing Compiler

OdHUG 2015 April MeetUp

Avatar for Sergey Bushnyak

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