Razor 解析器並非單一正則引擎,而是由三大組件協作:標記解析器、程式碼解析器 (C#/VB)、中央控制器。三者透過狀態機與遞迴呼叫完成解析。
<ul>
@foreach(var p in Model.Products) {
<li>@p.Name ($@p.Price)</li>
}
</ul>
HtmlMarkupParser.ParseDocument() 掃描至 @。CSharpCodeParser.ParseBlock() 解析 foreach 區塊。<li>,程式碼解析器識別非 C# 語法,回呼 HtmlMarkupParser.ParseBlock() 解析標記區塊。@p.Name,再次切換至程式碼解析器解析隱含運算式。HtmlMarkupParser.ParseDocument → CSharpCodeParser.ParseBlock → HtmlMarkupParser.ParseBlock → CSharpCodeParser.ParseBlock。</li> 結束標記區塊,返回 foreach 區塊,最終 } 結束程式碼區塊,回到文件頂層。<% %> 切換。Razor 解析器的多組件協作與遞迴下降架構,賦予其強大的語法推斷能力,實現「少儀式、高可讀」的模板體驗。