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
Day25. 如何解析 HTML 語法
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Kalan
October 04, 2020
Programming
190
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
830
選擇 Svelte 的三個理由 - JSDC
kjj6198
0
420
Svelte - 如何在前端框架中脫穎而出 | ModernWeb'21
kjj6198
0
230
状態管理を楽にする道
kjj6198
1
440
Day24. Svelte 如何編譯程式碼(2)
kjj6198
0
240
Svelte 如何編譯程式碼(1)
kjj6198
0
250
Day22. Svelte 經驗談
kjj6198
0
220
Day18. UI 實戰篇 - 圖片檢視器
kjj6198
0
210
Day17. UI 實戰篇 - 音樂播放器
kjj6198
0
110
Other Decks in Programming
See All in Programming
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
220
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
370
Android CLI
fornewid
0
220
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
230
What's New in Android 2026
veronikapj
0
260
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
730
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
180
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
170
数百円から始めるRuby電子工作
tarosay
0
150
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
280
プロポーザルを書いてもらう
pvcresin
0
530
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
490
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
470
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
390
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
640
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
240
Utilizing Notion as your number one productivity tool
mfonobong
4
540
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
490
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The browser strikes back
jonoalderson
0
1.5k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
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