2013-07-20 3 views
0

Im только начинаем изучать шаблон строки и ив попадался пример, показанный здесь:Как вставить шаблон строки в другой шаблон строки ST 4,0

group simple; 
vardef(type,name) ::= "<type> <name>;" 

method(type,name,args) ::= << 
    <type> <name>(<args; separator=",">) { 
     <statements; separator="\n"> 
    } 
>> 

То, что я хочу сделать, это пропуск в StringTemplate как аргумент метода StringTemplate следующим образом:

statements(function, arguments) ::= << 
    <function>(<arguments; separator=",">); 
>> 

method(type,name,args, <statements>) ::= << 
    <type> <name>(<args; separator=",">) { 
    <statements; separator="\n"> 
    } 
>> 

Однако это не работало так, им угадать его невозможно передать stringtemplates в stringtemplates? Затем как заполняются заявления?

я получаю следующее сообщение об ошибке при попытке это:

mytemplate.stg 14:26: invalid character '<' 
mytemplate.stg 14:36: invalid character '>' 

ответ

2

Я использую StringTemplate 4 с C#, и я столкнулся с той же проблемой при создании общего «разграничить» шаблон, который будет принимать в качестве параметров коллекцию, операцию отображения (анонимный шаблон) над каждым элементом и разделитель (также анонимный шаблон). Шаблонные параметры работают, но я не мог заставить механизм передачи параметров работать; вместо этого мне пришлось полагаться на динамическое масштабирование и переменную с именем item, существующей в контексте вызывающего.

NormalGet(schema, table) ::= << 
CREATE PROCEDURE [<schema.Name>].[Get<table.Name>] 
    <Delimit(items = table.Cols, itemTransformer = {@<item.Name> <item.ListType> readonly},  delimiter = ",\n")> 
AS 
BEGIN 
END 
>> 

и Разделяйте:

Delimit(items, itemTransformer, delimiter) ::= << 
<trunc(items): { item | <itemTransformer><delimiter>} ><last(items): { item |<itemTransformer> } > 
>> 

дает мне что-то вроде:

CREATE PROCEDURE [data].[GetCluster] 
    @idCluster common.intList readonly, 
    @Name common.varcharList readonly, 
    @Category common.varcharList readonly, 
    @DisplayOrder common.intList readonly, 
    @IsEditable common.bitList readonly 
AS 
BEGIN 
END 

, что я хотел бы сделать, это заменить мой призыв к Разделяйте с чем-то вроде этого:

<Delimit(items = table.Cols, itemTransformer = {col | @<col.Name> <col.ListType> readonly},  delimiter = ",\n")> 

но я не могу отработать t он синтаксис для этого или если это даже возможно.

Смежные вопросы