2013-02-26 74 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 <%...%>格式簡單的閱讀,因爲我已經使用的格式更多,我已經有了一些既定的模式識別的那些事情。擁有明確的開始/結束令牌,處理更簡單,就地讀取更簡單。