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
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
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
6.6k
Agentic UI
manfredsteyer
PRO
0
150
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
190
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
160
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
110
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Contextとはなにか
chiroruxx
1
310
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.5k
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.5k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
160
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Featured
See All Featured
Side Projects
sachag
455
43k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
310
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
240
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
320
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Context Engineering - Making Every Token Count
addyosmani
9
960
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Believing is Seeing
oripsolob
1
140
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
Аттрибутные граматики Добавляем дополнительный контекст к произведениям, описать свойство или
взаимосвязь