154 lines
4.5 KiB
Plaintext
154 lines
4.5 KiB
Plaintext
/*
|
|
* [The "BSD license"]
|
|
* Copyright (c) 2011 Terence Parr
|
|
* All rights reserved.
|
|
*
|
|
* Conversion to C#:
|
|
* Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
/** Template subgroup to add template rewrite output
|
|
* If debugging, then you'll also get STDbg.stg loaded.
|
|
*/
|
|
|
|
@outputFile.imports() ::= <<
|
|
<@super.imports()>
|
|
using Antlr3.ST;
|
|
using Antlr3.ST.Language;
|
|
>>
|
|
|
|
@genericParser.members() ::= <<
|
|
<@super.members()>
|
|
private StringTemplateGroup _templateGroup = new StringTemplateGroup("<name>Templates", typeof(AngleBracketTemplateLexer) );
|
|
|
|
public StringTemplateGroup TemplateGroup
|
|
{
|
|
get { return _templateGroup; }
|
|
set { _templateGroup = value; }
|
|
}
|
|
>>
|
|
|
|
ruleReturnBaseType() ::= <%
|
|
Template<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope\<StringTemplate, <labelType>>
|
|
%>
|
|
|
|
/** x+=rule when output=template */
|
|
ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
|
|
<ruleRef(...)>
|
|
<listLabelElem(elem={<label>.Template},elemType="StringTemplate",...)>
|
|
>>
|
|
|
|
rewriteTemplate(alts) ::= <<
|
|
|
|
// TEMPLATE REWRITE
|
|
<if(backtracking)>
|
|
if (<actions.(actionScope).synpredgate>)
|
|
{
|
|
<alts:rewriteTemplateAlt(); separator="else ">
|
|
<if(rewriteMode)><replaceTextInLine()><endif>
|
|
}
|
|
<else>
|
|
<alts:rewriteTemplateAlt(); separator="else ">
|
|
<if(rewriteMode)><replaceTextInLine()><endif>
|
|
<endif>
|
|
>>
|
|
|
|
replaceTextInLine() ::= <<
|
|
<if(TREE_PARSER)>
|
|
((TokenRewriteStream)input.TokenStream).Replace(
|
|
input.TreeAdaptor.GetTokenStartIndex(retval.Start),
|
|
input.TreeAdaptor.GetTokenStopIndex(retval.Start),
|
|
retval.Template);
|
|
<else>
|
|
((TokenRewriteStream)input).Replace(
|
|
retval.Start.TokenIndex,
|
|
input.LT(-1).TokenIndex,
|
|
retval.Template);
|
|
<endif>
|
|
>>
|
|
|
|
rewriteTemplateAlt(it) ::= <<
|
|
// <it.description>
|
|
<if(it.pred)>
|
|
if (<it.pred>)
|
|
{
|
|
retval.Template = <it.alt>;
|
|
}<\n>
|
|
<else>
|
|
{
|
|
retval.Template = <it.alt>;
|
|
}<\n>
|
|
<endif>
|
|
>>
|
|
|
|
rewriteEmptyTemplate(alts) ::= <<
|
|
null;
|
|
>>
|
|
|
|
/** Invoke a template with a set of attribute name/value pairs.
|
|
* Set the value of the rule's template *after* having set
|
|
* the attributes because the rule's template might be used as
|
|
* an attribute to build a bigger template; you get a self-embedded
|
|
* template.
|
|
*/
|
|
rewriteExternalTemplate(name,args) ::= <%
|
|
TemplateGroup.GetInstanceOf("<name>"<optionalArguments(args)>)
|
|
%>
|
|
|
|
/** expr is a string expression that says what template to load */
|
|
rewriteIndirectTemplate(expr,args) ::= <%
|
|
TemplateGroup.GetInstanceOf(<expr><optionalArguments(args)>)
|
|
%>
|
|
|
|
/** Invoke an inline template with a set of attribute name/value pairs */
|
|
rewriteInlineTemplate(args, template) ::= <%
|
|
new StringTemplate(TemplateGroup, "<template>"<optionalArguments(args)>)
|
|
%>
|
|
|
|
optionalArguments(args) ::= <<
|
|
<if(args)>,
|
|
new Dictionary\<string, object>() { <args:optionalArgument(); separator=", "> }
|
|
<endif>
|
|
>>
|
|
|
|
optionalArgument(it) ::= <<
|
|
{"<it.name>", <it.value>}
|
|
>>
|
|
|
|
/** plain -> {foo} action */
|
|
rewriteAction(action) ::= <<
|
|
<action>
|
|
>>
|
|
|
|
/** An action has %st.attrName=expr; or %{st}.attrName=expr; */
|
|
actionSetAttribute(st,attrName,expr) ::= <<
|
|
(<st>).SetAttribute("<attrName>",<expr>);
|
|
>>
|
|
|
|
/** Translate %{stringExpr} */
|
|
actionStringConstructor(stringExpr) ::= <<
|
|
new StringTemplate(TemplateGroup,<stringExpr>)
|
|
>>
|