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
Day25. 如何解析 HTML 語法
Search
Kalan
October 04, 2020
Programming
230
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Day25. 如何解析 HTML 語法
Kalan
October 04, 2020
More Decks by Kalan
See All by Kalan
單頁式應用中的無障礙設計
kjj6198
0
870
選擇 Svelte 的三個理由 - JSDC
kjj6198
0
470
Svelte - 如何在前端框架中脫穎而出 | ModernWeb'21
kjj6198
0
270
状態管理を楽にする道
kjj6198
1
480
Day24. Svelte 如何編譯程式碼(2)
kjj6198
0
260
Svelte 如何編譯程式碼(1)
kjj6198
0
300
Day22. Svelte 經驗談
kjj6198
0
270
Day18. UI 實戰篇 - 圖片檢視器
kjj6198
0
250
Day17. UI 實戰篇 - 音樂播放器
kjj6198
0
150
Other Decks in Programming
See All in Programming
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.9k
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
150
AI-Powered Domain-Driven Design
ziobrando
0
340
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
990
気持ちぃ〜角丸 Squircle
ryu1013
0
360
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.4k
Domain-Driven Transformation
hschwentner
2
2.3k
残高管理から台帳サービスへの進化
artoy
1
220
Jetpack Compose Mechanisms
skydoves
3
880
ActionController meets Protocol Buffers
sorah
1
730
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
260
AI時代のIaC入門 〜なぜインフラをコードで管理したいのか?〜 / Introduction to IaC in the AI Era
akihisaikeda
5
1.1k
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
46
8.4k
Music & Morning Musume
bryan
48
7.5k
Why Our Code Smells
bkeepers
PRO
340
58k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
860
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
500
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Deep Space Network (abreviated)
tonyrice
0
390
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
47k
Optimising Largest Contentful Paint
csswizardry
37
4k
Color Theory Basics | Prateek | Gurzu
gurzu
1
500
Marketing to machines
jonoalderson
1
5.9k
Agile that works and the tools we love
rasmusluckow
331
22k
Transcript
第 12 屆 IT 鐵⼈賽 30 天從 0 到 1
學 Svelte Day25 - 如何解析 HTML(svelte)語法?
第 12 屆 IT 鐵⼈賽 解析 HTML 的⽬的 將語法轉成比較容易給程式處理的語法樹(AST)
第 12 屆 IT 鐵⼈賽 流程概覽 詞法分析 (Lexer) 語法分析 ⽣成抽象語法樹
⽣成程式碼
第 12 屆 IT 鐵⼈賽 流程概覽 詞法分析 (Lexer) 語法分析 ⽣成抽象語法樹
⽣成程式碼
第 12 屆 IT 鐵⼈賽 如何將語法轉為語法樹 div p p p
Hello text text <div> <p>Hello"</p> <p>text"</p> <p>text"</p> "</div>
第 12 屆 IT 鐵⼈賽 有限狀態機 tag_open tag_name < read_text
attribute tag_close /> attribute_name = data-toggle attribute_value " "
第 12 屆 IT 鐵⼈賽 範例 1 <div>Hello</div> 讀取 "<":
進入 tag_open 狀態,開始讀取 tag_name 讀取 "d":進入 tag_name 狀態,name += "d" 讀取 "i":tag_name 狀態,name += "i" 讀取 "v":tag_name 狀態,name += "v" 讀取 ">":回到初始狀態,保存當前 tag_name
第 12 屆 IT 鐵⼈賽 範例 1 <div>Hello</div> 讀取 "H":進入
text 狀態,讀取 text += "H" 讀取 "e":text 狀態,讀取 text += "e" 讀取 "l":text 狀態,讀取 text += "l" 讀取 "l":text 狀態,讀取 text += "l" 讀取 "o":text 狀態,讀取 text += "o" 讀取 "<":進入 tag_open 狀態 讀取:"/":進入 tag_close 狀態 讀取 "div":將 tag_name 設為 div 讀取 ">":回到初始狀態,完成解析
第 12 屆 IT 鐵⼈賽 解析後產⽣的資料 type: Element tag_name: div
children: [{ type: 'Text', data: 'Hello' }]
第 12 屆 IT 鐵⼈賽 範例 2 <p role="status">Hello</p> 讀取
"<": 進入 tag_open 狀態,開始讀取 tag_name 讀取 "p":進入 tag_name 狀態,name += "p" 讀取 " ":忽略 讀取 "r":進入 attribute_name 狀態,attr += "r" 讀取 "o":attribute_name 狀態,attr += "o" 讀取 "l":attribute_name 狀態,attr += "l" 讀取 "e":attribute_name 狀態,attr += "e"
第 12 屆 IT 鐵⼈賽 範例 2 <p role="status">Hello</p> 讀取
"=": 進入 attribute_value 狀態,開始讀取 value 讀取 """:attribute_value_double_quote 狀態 讀取 "s":attribute_value 狀態,attr += "s" 讀取 "t":attribute_value 狀態,attr += "t" 讀取 "a":attribute_value 狀態,attr += "a" 讀取 "t":attribute_value 狀態,attr += "t" 讀取 "u":attribute_value 狀態,attr += "u" 讀取 "s":attribute_value 狀態,attr += "s"
第 12 屆 IT 鐵⼈賽 範例 2 <p role="status">Hello</p> 讀取
""": 退出 attribute_value 狀態 讀取 ">":進入 tag_close 狀態 讀取...:流程省略
第 12 屆 IT 鐵⼈賽 解析後產⽣的資料 type: Element tag_name: p
attrs: { role: "status" } children: [{ type: 'Text', data: 'Hello' }]
第 12 屆 IT 鐵⼈賽 HTML 是可遞迴的標記語⾔ 例如: <div> <p>Text
1</p> <ul> <li>1234</li> <li>45567</li> </ul> </div>
第 12 屆 IT 鐵⼈賽 遞迴下降解析器
第 12 屆 IT 鐵⼈賽 為什麼 Svelte 要⾃⼰寫解析器? ⽀援 svelte
語法如 bind, on, if block 等等 解析後可以在編譯時做到依賴追蹤、變數宣告與否、警告等
第 12 屆 IT 鐵⼈賽 ⼀些要注意的事情 HTML 可⽀援某些無 close 的標籤
⼤⼩寫 省略了像是 CDATA、comment 等處理 https://html.spec.whatwg.org/multipage/parsing.html