|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
java的设计机制:首先产生一个中间码,第二部编译为本地(机器)码。这个机制有很大的缺点。ASPX语法对照复杂,以是ASPX剖析器几近完整是经由过程正则表达式来完成的。Razor剖析器与ASPX剖析器之间有很年夜分歧,它实践上分为三个自力的组件:
1)了解基本HTML语法的标志剖析器;
2)了解基本C#大概VB语法的代码剖析器;
3)了解标志和代码怎样夹杂的中心把持器
以是Razor剖析器有三个介入者:代码剖析器,标志剖析器,代码剖析器。三个组件互相共同,协同事情完成对Razor文档的剖析。Razor剖析器有三种形态,分离是:剖析标志文档、剖析标志块,剖析代码块,任何情形下剖析器都处在以上三种形态中的一种形态上。前两种形态由标志剖析器来处置,最初一种形态由代码剖析器处置。
在此我们仍然利用前次的例子来讲明利用这些组件剖析Razor文档的历程。
文件内容以下:
<ul>
@foreach(var p in Model.Products) {
<li>@p.Name ($@p.Price)</li>
}
</ul>
我们从最下面入手下手剖析历程。当第一次挪用中心剖析器的时分,它会挪用标志剖析器来剖析标志文档。此时,剖析器处在剖析标志文档形态,在这类形态下,它会一向向前扫描,直到找到下一个"@"字符,除此以外它不体贴任何标志大概别的HTML相干的内容。当碰到一个"@"字符的时分,它会经由过程检察"@"字符前后的内容,并据此判别是切换到代码形态呢仍是这仅仅是一个email地点。这是默许的处置体例,可是有些特别情形会强迫剖析器切换到代码剖析形态。本例中,当剖析到"@"字符的时分,会发明该字符的后面是空格,据此判断这并非一个正当的email地点,以是切换到代码剖析形态。
标志剖析器接着挪用代码剖析器,让其来剖析代码块。在Razor中块为独自的一段代码大概是有明白入手下手停止字符序列的标志,因此此处的"foreach"声明是代码块,它以字符"f"入手下手,以字符"}"停止。代码剖析器十分分明C#语法,他会跟踪C#指令,当碰到"<li>"字符序列的时分,它晓得此处应当是C#指令的入手下手,但C#其实不撑持如许的指令,因此代码剖析器会再次挪用标志剖析器来剖析接上去的HTML代码块。如许在代码和标志剖析器之间创立一种从标志剖析入手下手,进进代码剖析,然后再进进标志剖析….的递回历程。到今朝为止,剖析器内的挪用栈应当相似于以下布局(省略了一些匡助办法):
HtmlMarkupParser.ParseDocument()
CSharpCodeParser.ParseBlock()
HtmlMarkupParser.ParseBlock()
我们能够从中看出ASPX和Razor的区分:在ASPX文件中,代码和标志能够看做是两个并行的流,我们写一些标志然后跳已往写一些代码,再跳返来写标志,云云举行;而Razor文件更像是一棵树,我们写一些标志,然后在标志内里写一些代码,再在代码中嵌进标志….。
以是我们仅必要挪用标志剖析器往剖析"<li>"和"</li>"之间的标志块,在没有抵达"</li>"之前剖析器以为标志块还没停止,哪怕在标志之间有"}"字符都不会打断"foreach"声明。
当剖析"<li>"的时分,标志剖析器发明了"@"字符,因此代码剖析器会被挪用,此时栈布局酿成:
HtmlMarkupParser.ParseDocument()
CSharpCodeParser.ParseBlock()
HtmlMarkupParser.ParseBlock()
CSharpCodeParser.ParseBlock()
关于这些代码块怎样停止的详细信息今后再做先容,可是终极我们会完成这些代码块的剖析而且回到"<li>"块中,在"</li>"以后又回到了"foreach"块中,最初"}"字符停止了"foreach"块,从头回到栈的顶端:标志文档。以后由于没发明新的"@"字符,文档剖析器将一向剖析到文件的开头。
也不知道,我同学昨天说数据挖掘很好。 |
|