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() );

Пожалуйста, дайте мне знать, если я что-то пропустил, Сэм. Благодарю.

Другие вопросы по тегам