1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2007-2008 Johannes Luber
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2005-2007 Kunle Odutola
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Sam Harwell
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Terence Parr
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved.
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met:
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer in the
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    documentation and/or other materials provided with the distribution.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    derived from this software without specific prior written permission.
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Template subgroup to add template rewrite output
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If debugging, then you'll also get STDbg.stg loaded.
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@outputFile.imports() ::= <<
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@super.imports()>
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusing Antlr.StringTemplate;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusing Antlr.StringTemplate.Language;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!backtracking)>
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusing Hashtable = System.Collections.Hashtable;
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Add this to each rule's return value struct */
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@returnScope.ruleReturnMembers() ::= <<
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate StringTemplate _st;
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic StringTemplate Template { get { return _st; } set { _st = value; } }
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic override string ToString() { return (Template==null) ? string.Empty : Template.ToString(); }
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@genericParser.members() ::= <<
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@super.members()>
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected StringTemplateGroup templateLib = new StringTemplateGroup("<name>Templates", typeof(AngleBracketTemplateLexer) );
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic StringTemplateGroup TemplateLib
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 	get { return this.templateLib; }
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 	set { this.templateLib = value; }
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// \<summary> Allows convenient multi-value initialization:
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///  "new STAttrMap().Add(...).Add(...)"
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// \</summary>
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected class STAttrMap : Hashtable
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public STAttrMap Add(string attrName, object value)
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  {
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    base.Add(attrName, value);
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return this;
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public STAttrMap Add(string attrName, int value)
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  {
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    base.Add(attrName, value);
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return this;
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** x+=rule when output=template */
81324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)>
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label+".Template",...)>
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
86324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteTemplate(alts) ::= <<
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// TEMPLATE REWRITE
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <actions.(actionScope).synpredgate> )
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <alts:rewriteTemplateAlt(); separator="else ">
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <if(rewriteMode)><replaceTextInLine()><endif>
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts:rewriteTemplateAlt(); separator="else ">
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(rewriteMode)><replaceTextInLine()><endif>
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
101324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreplaceTextInLine() ::= <<
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((TokenRewriteStream)input.TokenStream).Replace(
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.TreeAdaptor.GetTokenStartIndex(retval.Start),
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.TreeAdaptor.GetTokenStopIndex(retval.Start),
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  retval.Template);
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((TokenRewriteStream)input).Replace(
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ((IToken)retval.Start).TokenIndex,
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.LT(-1).TokenIndex,
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  retval.Template);
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
115324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteTemplateAlt() ::= <<
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <it.description>
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(it.pred)>
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (<it.pred>) {
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    retval.Template = <it.alt>;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    retval.Template = <it.alt>;
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteEmptyTemplate(alts) ::= <<
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernull;
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Invoke a template with a set of attribute name/value pairs.
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Set the value of the rule's template *after* having set
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  the attributes because the rule's template might be used as
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  an attribute to build a bigger template; you get a self-embedded
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  template.
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
138324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteExternalTemplate(name,args) ::= <<
139324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertemplateLib.GetInstanceOf("<name>"<if(args)>,
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  new STAttrMap()<args:{a | .Add("<a.name>", <a.value>)}>
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <endif>)
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** expr is a string expression that says what template to load */
145324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteIndirectTemplate(expr,args) ::= <<
146324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertemplateLib.GetInstanceOf(<expr><if(args)>,
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  new STAttrMap()<args:{a | .Add("<a.name>", <a.value>)}>
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <endif>)
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Invoke an inline template with a set of attribute name/value pairs */
152324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteInlineTemplate(args, template) ::= <<
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernew StringTemplate(templateLib, "<template>"<if(args)>,
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  new STAttrMap()<args:{a | .Add("<a.name>", <a.value>)}>
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <endif>)
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** plain -> {foo} action */
159324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteAction(action) ::= <<
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<action>
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An action has %st.attrName=expr; or %{st}.attrName=expr; */
164324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveractionSetAttribute(st,attrName,expr) ::= <<
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<st>).SetAttribute("<attrName>",<expr>);
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Translate %{stringExpr} */
169324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveractionStringConstructor(stringExpr) ::= <<
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernew StringTemplate(templateLib,<stringExpr>)
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
172