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
88
Parallel Haskell
sigrlami
0
71
Основы ФП
sigrlami
0
150
Other Decks in Programming
See All in Programming
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
1k
dRuby over BLE
makicamel
2
410
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
230
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
140
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.8k
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
13
2.2k
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
450
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
230
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
140
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.8k
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
120
Vite+ Unified Toolchain for the Web
naokihaba
0
610
Featured
See All Featured
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
260
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
580
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Making the Leap to Tech Lead
cromwellryan
135
10k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
340
Visualization
eitanlees
152
17k
The Spectacular Lies of Maps
axbom
PRO
1
850
Designing for humans not robots
tammielis
254
26k
GitHub's CSS Performance
jonrohan
1033
470k
A Tale of Four Properties
chriscoyier
163
24k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
440
For a Future-Friendly Web
brad_frost
183
10k
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
Аттрибутные граматики Добавляем дополнительный контекст к произведениям, описать свойство или
взаимосвязь