Frage

Neben jeder wirkliche Arbeit zu erledigen, ich habe einen Juckreiz. Mein Juckreiz ist eine Ansicht Motor zu schreiben, die genau ein Template-System aus einer anderen Sprache nachahmt (Template Toolkit / Perl). Dies ist einer von denen, wenn ich Zeit habe / tut ihm etwas Neue Art von Projekten zu lernen.

Ich habe Zeit damit verbracht an CoCo / R und ANTLR suchen, und ehrlich gesagt, es macht mein Gehirn verletzt, aber einige von CoCo / R in versinkt. Leider sind die meisten der Beispiele über einen Compiler erstellen, die Quellcode liest , aber keiner scheint zu decken, wie ein Prozessor für die Vorlagen erstellen.

Ja, sind diejenigen, die gleiche Sache, aber ich kann meinen Kopf nicht umschlingen, wie die Sprache für Vorlagen zu definieren, wo die meisten der Quelle der HTML, anstatt tatsächliche Code analysiert werden und ausgeführt werden.

Gibt es gute Anfänger Ressourcen gibt für diese Art der Sache? Ich habe eine Ganer bei Funken genommen, die nicht die Grammatik im Repo zu haben schienen.

Vielleicht ist das übertrieben, und man könnte Template Syntax mit c # in der Datei und kompiliert es nur Test ersetzen. http://msdn.microsoft.com/en-us/magazine/ cc136756.aspx # S2

Wenn Sie in meinen Schuhen sind und Experten keine Sprache zu schaffen, wo würden Sie anfangen?

War es hilfreich?

Lösung

Die Spark-Grammatik ist mit einer Art-of-fließend domänenspezifischen Sprache umgesetzt.

Es ist in einigen Schichten erklärt. Die Regeln, die die HTML-Syntax erkennen deklariert in MarkupGrammar.cs - die auf Grammatikregeln direkt aus der xML-Spezifikation kopiert basieren

.

Die Markup-Regeln beziehen sich auf eine begrenzte Teilmenge von csharp Syntaxregeln deklariert in CodeGrammar.cs -. das ist eine Teilmenge, weil Funken muss nur genug csharp erkennen Apostrophe um Strings einzustellen, um zu doppelte Anführungszeichen, match curley Zahnspange, etc

Die einzelnen Regeln selbst vom Typ sind ParseAction < TValue> Delegierte die eine Position und gibt ein parseResult . Die parseResult ist eine einfache Klasse, die das TValue Datenelement durch die Wirkung und eine neue Position Instanz analysiert enthält, die hinter dem Inhalt vorgeschoben worden ist, die die TValue produziert.

Das ist nicht sehr nützlich, auf seine eigenen, bis Sie ein kleine Anzahl von Operatoren , wie in Packrat Parser , die einzelnen Parsing-Aktionen bauen sehr detailliert und robust Ausdrücke über die Form verschiedener Syntax Konstrukte kombinieren kann.

Die Technik der Verwendung eines Delegaten als Parse-Aktion stammte aus einer Luke H Blog-Post Monadic Parser Kombinatoren unter Verwendung von C # 3.0 . Ich schrieb auch einen Beitrag über Erstellen einer Domain Specific Sprache für das Parsen .

Es ist auch durchaus möglich, wenn man so will, die Spark.dll Assembly verweisen und eine Klasse von der Basis CharGrammar erbt eine völlig neue Grammatik für eine bestimmte Syntax zu erstellen. Es ist wahrscheinlich der schnellste Weg, um mit dieser Technik zu experimentieren, und ein Beispiel dafür, dass in CharGrammarTester.cs .

Andere Tipps

Schritt 1. Verwenden Sie reguläre Ausdrücke (Regexp Substitution) Ihre Eingabemaske Zeichenfolge in eine Token-Liste zu teilen, zum Beispiel 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>!')

Schritt 2. Konvertieren Sie Ihre Token-Liste auf einen Syntaxbaum:

* 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. Schritt eine rekursive Funktion (die so genannte Interpreter) schreiben, die Ihren Baum gehen und die Anweisungen ausführen.

Einen weiteren, alternativen Ansatz (anstelle der Schritte 1--3), wenn Ihre Sprache unterstützt eval () (wie Perl, Python, Ruby): eine regexp Substitution verwenden, um die Vorlage zu einem eval () zu konvertieren - in der Lage Zeichenfolge in die Host-Sprache, und führen Sie eval (), um die Vorlage zu instanziieren.

Es gibt sooo viele Dinge zu tun. Aber es funktioniert für auf einfache GET-Anweisung sowie einen Test. Das ist ein Anfang.

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

Am Ende hatte ich schon zu viel Zeit in ANTLR loudejs' Methode gehen zu geben. Ich wollte ein wenig mehr Zeit auf den gesamten Prozess verbringen, anstatt den Parser / Lexer. Vielleicht 2 in Version kann ich auf dem Spark-Weg ein zu gehen, wenn mein Gehirn versteht die Dinge ein wenig mehr.

Vici Parser (früher als LazyParser.NET bekannt) ist ein Open-Source tokenizer / Templateparser / Ausdrucksparser, die Ihnen den Einstieg helfen können.

Wenn es nicht das, was Sie suchen, dann können Sie einige Ideen erhalten, indem auf den Quellcode suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top