2013-02-26 36 views
3

我很感兴趣,喜欢Razor视图引擎解析器如何解析两种不同的语言,如C#和JavaScript。使用哪些技术来编写在语言之间切换的解析器?

这是非常酷的,下面的作品,例如:

$("#fm_duedate").val('@DateTime.Now.AddMonths(1).ToString("MM/dd/yyyy")'); 

我要去尝试,并期待在源代码,但我很好奇,如果有一个某种理论基础的像一个解析器这或者更像是采取两种语言的联合并解析它的蛮力吗?

试图为自己推理它,我说“你从每种语言的解析器开始,然后你为每一种语言添加一组产品,将它切换到另一种产品”,但我怀疑它如此简单。

我想完美的答案是讨论Razor引擎是如何实现的,或者是源代码的漫步(我实际上并没有真正Google因为害怕掉下兔子洞而讨论这个问题)。或者,对于如何解析两种语言的问题,一些见解将会很棒。

回答

4

由于科里指出,剃须刀和类似的框架没有做什么特别花哨。

但也有一些建筑的解析器,其中一种语言嵌入到另一个语言理论上更完善的车型。我从前的同事卢克·霍本对解析器组合,它提供一个非常好的方式来建立一个解析器一个语言嵌入功能于另一种语言的情况下一个伟大的介绍性文章:

http://blogs.msdn.com/b/lukeh/archive/2007/08/19/monadic-parser-combinators-using-c-3-0.aspx

Wikipedia页面也很简单:

http://en.wikipedia.org/wiki/Parser_combinator

3

剃刀(和其他视图引擎)并不解析视图的HTML或JavaScript。相反,他们解析文本来检测特定的令牌,而不关心周围的文本。

在剃刀的情况下,源文件中的每个字符@被处理为某种类型的代码块。剃刀是相当智能有关检测随后的@字符,包括处理之类的东西@foreach (var x in collection) {和定位闭合}试图解析(或JavaScript)内的HTML的表达。它也可以让你使用@{ }@()覆盖处理的程度。

我找到ASPX <%...%>格式简单的阅读,因为我已经使用的格式更多,我已经有了一些既定的模式识别的那些事情。拥有明确的开始/结束令牌,处理更简单,就地读取更简单。