Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Developing Compiler
Search
Sergey Bushnyak
April 30, 2015
Programming
68
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
280
BII Summit - KlickZie - zChain Blockchain Technology
sigrlami
0
100
FRP. Reflex
sigrlami
0
92
Parallel Haskell
sigrlami
0
72
Основы ФП
sigrlami
0
150
Other Decks in Programming
See All in Programming
AIエージェント時代のコードレビューを設計する
nogu66
6
2.6k
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
520
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
110
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
110
Foundry Localでエージェント開発
seosoft
0
160
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
5.7k
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
55
37k
XHTMLが残したもの
yosuke_furukawa
PRO
2
630
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
910
What We Talk About When We Talk About XP
m_seki
2
450
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
1.6k
信頼性の目標を誰も求めてない
shubox
0
500
Featured
See All Featured
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
570
Rails Girls Zürich Keynote
gr2m
96
14k
Typedesign – Prime Four
hannesfritz
42
3.2k
It's Worth the Effort
3n
188
29k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Into the Great Unknown - MozCon
thekraken
41
2.7k
sira's awesome portfolio website redesign presentation
elsirapls
0
410
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
520
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
510
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Designing Powerful Visuals for Engaging Learning
tmiket
1
540
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
Аттрибутные граматики Добавляем дополнительный контекст к произведениям, описать свойство или
взаимосвязь