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
Kalan
October 04, 2020
Programming
180
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
400
Svelte - 如何在前端框架中脫穎而出 | ModernWeb'21
kjj6198
0
220
状態管理を楽にする道
kjj6198
1
430
Day24. Svelte 如何編譯程式碼(2)
kjj6198
0
230
Svelte 如何編譯程式碼(1)
kjj6198
0
240
Day22. Svelte 經驗談
kjj6198
0
210
Day18. UI 實戰篇 - 圖片檢視器
kjj6198
0
200
Day17. UI 實戰篇 - 音樂播放器
kjj6198
0
110
Other Decks in Programming
See All in Programming
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
280
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
330
3Dシーンの圧縮
fadis
1
680
柔軟なPDFレイアウトエディタを支える型システム設計 — Discriminated UnionとConditional Typeの実践
minako__ph
4
1.6k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
130
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
5
180
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
150
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
210
Inside Stream API
skrb
1
660
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
630
Oxlintのカスタムルールの現況
syumai
6
1k
Featured
See All Featured
WENDY [Excerpt]
tessaabrams
11
38k
Side Projects
sachag
455
43k
Building the Perfect Custom Keyboard
takai
2
790
BBQ
matthewcrist
89
10k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
580
Site-Speed That Sticks
csswizardry
13
1.2k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
820
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