StringTemplate против StringTemplateGroup
Я успешно использую StringTemplate 4 для генерации кода в Visual Studio. Я установил расширения для StringTemplate и ANTLR, и они действительно великолепны.
При тестировании я могу понять, как использовать файл *.st4 (StringTemplate), но как использовать файл *.stg (StringTemplateGroup), ускользает от меня. Это коллекция определений, которые могут быть встроены в другой StringTemplate? Если так, то как будет выглядеть код, который будет генерироваться из *.stg, а не из *.st4?
2 ответа
Файл группы StringTemplate представляет собой набор шаблонов, хранящихся в одном файле. Проект ANTLR на GitHub содержит много примеров; например, Java.stg, который содержит все шаблоны генерации кода для цели Java для ANTLR 4.
Вы можете найти несколько примеров использования StringTemplate 3 в C# в файле StringTemplateTests.cs из самого проекта StringTemplate C#. Это не самая дружелюбная документация, но она включает примеры, охватывающие широкий спектр функций ST3. Вот один пример использования StringTemplateGroup
:
string templates =
"group dork;" + newline +
"" + newline +
"test(name) ::= <<" +
"<(name)()>" + newline +
">>" + newline +
"first() ::= \"the first\"" + newline +
"second() ::= \"the second\"" + newline
;
StringTemplateGroup group =
new StringTemplateGroup( new StringReader( templates ) );
StringTemplate f = group.GetInstanceOf( "test" );
f.SetAttribute( "name", "first" );
string expecting = "the first";
Assert.AreEqual( expecting, f.ToString() );
Так что легче читать, код файла группы шаблонов в этом тесте выглядит так без экранирующих символов.
group dork;
test(name) ::= <<<(name)()>
>>
first() ::= "the first"
second() ::= "the second"
Я собираюсь ответить на свой вопрос здесь, чтобы добавить к тому, что Сэм смирился. Я думаю, что моя путаница была из-за огромных различий в соглашениях об именах и соглашениях о вызовах методов между ST3 и ST4. Ниже приведен перевод того, что Сэм поднял, используя ST4.
var sr = new StreamReader( "dork.stg" );
var txt = sr.ReadToEnd();
sr.Close();
TemplateGroup group = new TemplateGroupString( txt );
var f = group.GetInstanceOf( "test" );
f.Add( "name", "first" );
// writes out "the first"
Console.WriteLine( f.Render() );
Пожалуйста, дайте мне знать, если я что-то пропустил, Сэм. Благодарю.