编写在语言之间切换的解析器使用了哪些技术

本文关键字:技术 语言 之间 | 更新日期: 2023-09-27 18:01:20

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

很酷,下面的工作,例如:

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

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

试着为自己推理,我说"你从每种语言的解析器开始,然后你给每种语言添加一组产品,将其转换为另一种语言",但我怀疑它是否如此简单。

我想最完美的答案应该是讨论一下Razor引擎是如何实现的,或者是对源代码的一次浏览(我还没有在谷歌上搜索过这个,因为我害怕掉进兔子洞里)。或者,只要了解一下如何处理解析两种语言的问题就很好了。

编写在语言之间切换的解析器使用了哪些技术

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

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

http://blogs.msdn.com/b/lukeh/archive/2007/08/19/monadic -解析器组合子-使用- c - 3 - 0. - aspx

维基百科页面也很简单:

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

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

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

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