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
490
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
160
Other Decks in Programming
See All in Programming
JIS keyboard support in Omarchy
lef237
0
180
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
220
느린 네트워크와 저사양 디바이스 사용자를 위한 웹뷰 로딩 시간 개선기
kmkim
1
170
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
180
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
200
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
560
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
510
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
200
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
160
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
150
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
350
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
160
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
570
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
360
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
430
Accessibility Awareness
sabderemane
1
280
Ethics towards AI in product and experience design
skipperchong
2
460
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.7k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
500
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
760
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
680
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