3

Razor ビュー エンジンのようなパーサーが、C# と JavaScript のような 2 つの異なる言語をどのように解析できるかに興味があります。

たとえば、次のように動作することは非常にクールです。

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

ソースを調べてみますが、このようなパーサーにある種の理論的基盤があるのか​​ 、それとも2つの言語の結合を取り、それを解析するようなより力強いものなのか興味がありますか?

私は自分でそれを推論しようとして、「各言語のパーサーから始めて、それを別のパーサーに切り替える一連のプロダクションをそれぞれに追加する」と言いますが、それがそれほど単純であるとは思えません。

完璧な答えは、Razor エンジンがどのように実装されているか、またはソースのウォークスルーに関する議論へのポインタになると思います (うさぎの穴に落ちるのを恐れて、実際にはこれを Google で検索していません)。あるいは、2 つの言語を解析するという問題にどのようにアプローチするかについての洞察だけでも素晴らしいでしょう。

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 に答える