0

実際の仕事をする以外に、かゆみがあります。私の悩みは、別の言語(Template Toolkit / Perl)のテンプレートシステムを厳密に模倣するビューエンジンを作成することです。これは、新しい種類のプロジェクトを学ぶために時間があったり、やったりした場合の1つです。

私はCoCo/RとANTLRを調べることに時間を費やしました。正直なところ、それは私の脳を傷つけますが、CoCo / Rの一部は沈んでいます。残念ながら、ほとんどの例はソースコードを読み取るコンパイラの作成に関するものですが、テンプレート用のプロセッサを作成する方法をカバーしているようです。

はい、それらは同じことですが、実際のコードが解析されて実行されるのではなく、ソースのほとんどがhtmlであるテンプレートの言語を定義する方法に頭を悩ませることはできません。

この種のことのためにそこに良い初心者のリソースはありますか?私はSparkでガナーを取りましたが、レポに文法が含まれていないようです。

多分それはやり過ぎであり、ファイル内のテンプレート構文をc#にテスト置換してコンパイルすることができます。http://msdn.microsoft.com/en-us/magazine/cc136756.aspx#S2

あなたが私の立場にあり、言語作成の専門家ではなかったとしたら、どこから始めますか?

4

4 に答える 4

3

Spark文法は、一種の流暢なドメイン固有言語で実装されています。

それはいくつかの層で宣言されています。html構文を認識するルールは、MarkupGrammar.csで宣言されています。これらは、xml仕様から直接コピーされた文法ルールに基づいています。

マークアップルールは、 CodeGrammar.csで宣言されたcsharp構文ルールの限定されたサブセットを参照します。Sparkは文字列の周りのシングルクォートをダブルクォートに調整したり、中括弧を一致させたりするのに十分なcsharpを認識するだけでよいため、これらはサブセットです。

個々のルール自体は、位置を受け入れてParseResultを返すParseAction <TValue>デリゲートタイプです。ParseResultは、アクションによって解析されたTValueデータ項目と、TValueを生成したコンテンツを超えて進められた新しいPositionインスタンスを含む単純なクラスです。

これは、式の文法の解析で説明されているように、少数の演算子を導入するまでは、それ自体ではあまり役に立ちません。これにより、単一の解析アクションを組み合わせて、さまざまな構文構造の形状に関する非常に詳細で堅牢な式を構築できます。

デリゲートを解析アクションとして使用する手法は、LukeHのブログ投稿MonadicParser Combinators using C#3.0から得られました。また、解析用のドメイン固有言語の作成に関する投稿も書きました。

必要に応じて、Spark.dllアセンブリを参照し、ベースのCharGrammarからクラスを継承して、特定の構文のまったく新しい文法を作成することもできます。これはおそらく、この手法の実験を開始する最も簡単な方法であり、その例はCharGrammarTester.csにあります。

于 2009-05-10T08:44:41.090 に答える
0

ステップ 1. 正規表現 (regexp 置換) を使用して、入力テンプレート文字列をトークン リストに分割します (例: split)。

hel<b>lo[if foo]bar is [bar].[else]baz[end]world</b>!

write('hel<b>lo')
if('foo')
write('bar is')
substitute('bar')
write('.')
else()
write('baz')
end()
write('world</b>!')

ステップ 2. トークン リストを構文ツリーに変換します。

* Sequence
** Write
*** ('hel<b>lo')
** If
*** ('foo')
*** Sequence
**** Write
***** ('bar is')
**** Substitute
***** ('bar')
**** Write
***** ('.')
*** Write
**** ('baz')
** Write
*** ('world</b>!')

class Instruction {
}
class Write : Instruction {
  string text;
}
class Substitute : Instruction {
  string varname;
}
class Sequence : Instruction {
  Instruction[] items;
}
class If : Instruction {
  string condition;
  Instruction then;
  Instruction else;
}

ステップ 3. ツリーをたどってそこで命令を実行できる再帰関数 (インタープリターと呼ばれる) を作成します。

言語が eval() (Perl、Python、Ruby など) をサポートしている場合の別の代替アプローチ (ステップ 1 ~ 3 の代わり): 正規表現置換を使用して、テンプレートをホスト言語の eval() 可能な文字列に変換します。 、 eval() を実行してテンプレートをインスタンス化します。

于 2009-05-01T20:32:33.723 に答える
0

やるべきことがたくさんあります。ただし、単純な GET ステートメントとテストでは機能します。それが始まりです。

http://github.com/claco/tt.net/

結局、私は既に ANTLR で十分な時間を過ごしており、loudejs のメソッドを試すことができませんでした。パーサー/レクサーではなく、プロセス全体にもう少し時間を費やしたかったのです。バージョン 2 では、脳がもう少し物事を理解しているときに、Spark の方法を試すことができるかもしれません。

于 2009-05-28T13:32:10.493 に答える
0

Vici Parser (以前は LazyParser.NET として知られていた) は、開始に役立つオープンソースのトークナイザー/テンプレート パーサー/式パーサーです。

探しているものではない場合は、ソース コードを参照してアイデアを得ることができます。

于 2009-05-28T13:42:35.730 に答える