3

我对像 Razor 视图引擎这样的解析器如何解析两种不同的语言(如 C# 和 JavaScript)很感兴趣。

例如,以下工作非常酷:

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

我将尝试查看源代码,但我很好奇这样的解析器是否有某种理论基础,或者是否像结合两种语言并解析它那样更暴力?

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

我想完美的答案将是关于如何实现 Razor 引擎的讨论或源代码的演练的指针(我实际上并没有在谷歌上搜索过这个,因为害怕掉进兔子洞)。或者,只是对如何解决两种语言的解析问题有一些了解会很棒。

4

2 回答 2

4

正如 Corey 所指出的,Razor 和类似的框架并没有做任何特别花哨的事情。

但是,有一些理论上更合理的模型可以为一种语言嵌入另一种语言的语言构建解析器。我以前的同事 Luke Hoban 有一篇很棒的关于解析器组合器的介绍性文章,它提供了一种非常好的方法来为一种语言嵌入另一种语言的场景构建解析器:

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

维基百科页面也非常简单:

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

于 2013-02-26T06:46:28.463 回答
3

Razor(和其他视图引擎)不解析视图的 HTML 或 JavaScript。相反,它们解析文本以检测特定标记,而不真正关心周围的文本。

对于 Razor,@源文件中的每个字符都作为某种代码块进行处理。Razor 在检测字符后面的表达式方面非常聪明,包括处理和定位关闭之@类的事情,而不是尝试解析里面的 HTML(或 JavaScript)。它还允许您在一定程度上使用和覆盖处理。@foreach (var x in collection) {}@{ }@( )

我发现 ASPX<%...%>格式更易于阅读,因为我已经更多地使用该格式,并且我已经为这些格式进行了一些已建立的模式识别。具有显式的开始/结束标记更易于处理并且更易于就地读取。

于 2013-02-26T05:31:42.017 回答