Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Developing Compiler
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Sergey Bushnyak
April 30, 2015
Programming
67
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Developing Compiler
OdHUG 2015 April MeetUp
Sergey Bushnyak
April 30, 2015
More Decks by Sergey Bushnyak
See All by Sergey Bushnyak
Practical Frontend with Haskell and Reflex FRP
sigrlami
0
270
BII Summit - KlickZie - zChain Blockchain Technology
sigrlami
0
99
FRP. Reflex
sigrlami
0
87
Parallel Haskell
sigrlami
0
71
Основы ФП
sigrlami
0
150
Other Decks in Programming
See All in Programming
Agentic UI
manfredsteyer
PRO
0
150
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
120
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
5.4k
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
730
3Dシーンの圧縮
fadis
1
760
RTSPクライアントを自作してみた話
simotin13
0
600
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
160
net-httpのHTTP/2対応について
naruse
0
480
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
130
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
270
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
2
670
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
ラッコキーワード サービス紹介資料
rakko
1
3.6M
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Embracing the Ebb and Flow
colly
88
5.1k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
Building AI with AI
inesmontani
PRO
1
1.1k
A designer walks into a library…
pauljervisheath
211
24k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
570
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
850
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
Technical Leadership for Architectural Decision Making
baasie
3
400
Transcript
Разработка компилятора на Haskell @Sigrlami http://sigrlami.eu/ru/content/articles/writing-compiler-1.html
Что такое компилятор?
Зачем изучать компиляторы? • Полезно знать инструменты, которыми пользуешься. Понимать
вывод компилятора • Техники и алгоритмы используемые при разработке компилятора можно применять в других областях • Большой шанс, что вам прийдется писать компилятор для DSL или мета-языка
Идеализированный компилятор
None
None
Идеализированный компилятор • Проход (Pass) • Фаза (Phase)
Идеализированный компилятор Анализ
Идеализированный компилятор Синтез
Виды ошибок • Лексические – Неправильное название идентификатора • Синтаксические
– Отсутствует ; или другой разделитель – Неправильные отступы • Семантические – Неправильное присвоение • Логические – Бесконечный цикл
Интерпретация • анализирует и тут же выполняет программу • Не
гененирует машинный код • Программа выполняется только при наличии интерпретатора
Лексический анализ • Преобразование исходного кода в лексемы (token) •
Поиск лексических ошибок
Лексический анализ. BNF • Метаязык описания • Описание контекстно-свободных грамматик
Лексический анализ. 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" Категории лексем
Лексический анализ. 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
Лексический анализ Какие есть варианты для разбития кода на лексемы?
Лексический анализ. Прямой разбор • Дробление строки по пробелу •
Регэкспы • Парсер-комбинаторы • Конечный автомат • …(ваш вариант)
Лексический анализ. Автоматизация • Lex • GNU/ Flex • JavaCC
• Alex (Haskell)
Лексический анализ. Автоматизация
Лексический анализ Где можно использовать еще? • Pretty-printers (красивый вывод
кода) • Линтинг (статический анализ кода) • Разбор данных Лексер – это очень простой парсер
Синтаксический анализ • Преобразование лексем в синтаксическое дерево AST (abstract
syntax tree) • Поиск синтаксичеcких ошибок
Синтаксический анализ
Синтаксический анализ • Нетерминалы • Терминалы • Произведения
Синтаксический анализ. Top down Рекурсивный спуск
Синтаксический анализ. Bottom up
Синтаксический анализ.Автоматизация • Yacc • Bison • Happy (Haskell)
Синтаксический анализ
VHDL Цифровая электроника • FPGA • ASIC • Микропроцессоры
VHDL. Внешний вид • EBNF грамматика стандарта 2002 - 62
страницы • Мощный императивный язык
VHDL. Zephyrus • Alex - разбитие кода на лексемы •
Happy – несколько разных парсеров • .. • Profit
VHDL.Проблематика • Анализ кодовой базы выявил ~ 300 случаев неконсистетности
грамматики, исследовательские группы ~ 800 случаев • Недостаточно сильная система типов • Выявление критически ошибок на этапах симуляции
VHDL. Zephyrus • Alex - разбитие кода на лексемы •
Happy – несколько разных парсеров • Свой лексер (модернизировать алгоритмику) • Свой парсер (увеличить гибкость) https://github.com/sigrlami/zephyrus
Ключевых преимуществ Haskell • Аппликативные функторы <*> • Обощенные Алгебраические
типы данных (GADT) • Паттерн-матчинг АТД
Синтаксический анализ • Необходимо понимать контекст • Необходимо выявлять неконсистеность
в VHDL
Аттрибутные граматики Добавляем дополнительный контекст к произведениям, описать свойство или
взаимосвязь