質問

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

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

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

この種のことのための優れた初心者リソースはありますか? Sparkでganerを使用しましたが、リポジトリに文法が含まれていないようでした。

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

あなたが私の靴を履いていて、言語作成の専門家ではなかった場合、どこから始めますか?

役に立ちましたか?

解決

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

数層で宣言されています。 html構文を認識するルールは、で宣言されていますMarkupGrammar.cs -これらは、XML仕様から直接コピーされた文法規則に基づいています。

マークアップ規則は、 CodeGrammar.cs -これらはサブセットです。Sparkが認識する必要があるのは、文字列の周りのシングルクォートをダブルクォートに調整する、カーリーブレースに一致するなど、

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

少数の演算子式文法の解析で説明されているように、単一の解析アクションを組み合わせて、さまざまな構文構成の形状に関する非常に詳細で堅牢な式を構築できます。

解析アクションとしてデリゲートを使用する手法は、Luke Hのブログ投稿 C#3.0を使用したモナディックパーサーコンビネーター。また、ドメイン固有の作成に関する投稿も書きました。解析用の言語

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

他のヒント

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

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

to

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()を実行してテンプレートをインスタンス化します。

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

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

最終的に、私はすでにANTLRで余りにも多くの時間を費やしてloudejsの方法を試してみました。パーサー/レクサーではなく、プロセス全体にもう少し時間をかけたいと思いました。おそらくバージョン2では、脳が物事をもう少し理解しているときに、Sparkの方法を試すことができます。

Vici Parser (以前のLazyParser.NET)はオープンソースですトークナイザー/テンプレートパーサー/式パーサーは、開始に役立ちます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top