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
71
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
96
Parallel Haskell
sigrlami
0
73
Основы ФП
sigrlami
0
150
Other Decks in Programming
See All in Programming
アクセシビリティから考える情報設計
high_g_engineer
0
370
Java 27新機能 / Java 27 new features
kishida
2
140
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
120
新卒PdEのリアル
ryu1013
1
500
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
140
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
3
2.2k
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
150
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
240
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
240
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
350
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
速習iPhone Duo対応
yuukiw00w
1
260
Featured
See All Featured
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
400
Documentation Writing (for coders)
carmenintech
77
5.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
The Invisible Side of Design
smashingmag
301
52k
The browser strikes back
jonoalderson
0
1.7k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Navigating Weather and Climate Data
rabernat
0
520
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.9k
Being A Developer After 40
akosma
91
590k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
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
Аттрибутные граматики Добавляем дополнительный контекст к произведениям, описать свойство или
взаимосвязь