1 /* 2 * [The "BSD license"] 3 * Copyright (c) 2011 Terence Parr 4 * All rights reserved. 5 * 6 * Conversion to C#: 7 * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 /** Template subgroup to add template rewrite output 33 * If debugging, then you'll also get STDbg.stg loaded. 34 */ 35 36 @outputFile.imports() ::= << 37 <@super.imports()> 38 using Antlr3.ST; 39 using Antlr3.ST.Language; 40 >> 41 42 @genericParser.members() ::= << 43 <@super.members()> 44 private StringTemplateGroup _templateGroup = new StringTemplateGroup("<name>Templates", typeof(AngleBracketTemplateLexer) ); 45 46 public StringTemplateGroup TemplateGroup 47 { 48 get { return _templateGroup; } 49 set { _templateGroup = value; } 50 } 51 >> 52 53 ruleReturnBaseType() ::= <% 54 Template<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope\<StringTemplate, <labelType>> 55 %> 56 57 /** x+=rule when output=template */ 58 ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= << 59 <ruleRef(...)> 60 <listLabelElem(elem={<label>.Template},elemType="StringTemplate",...)> 61 >> 62 63 rewriteTemplate(alts) ::= << 64 65 // TEMPLATE REWRITE 66 <if(backtracking)> 67 if (<actions.(actionScope).synpredgate>) 68 { 69 <alts:rewriteTemplateAlt(); separator="else "> 70 <if(rewriteMode)><replaceTextInLine()><endif> 71 } 72 <else> 73 <alts:rewriteTemplateAlt(); separator="else "> 74 <if(rewriteMode)><replaceTextInLine()><endif> 75 <endif> 76 >> 77 78 replaceTextInLine() ::= << 79 <if(TREE_PARSER)> 80 ((TokenRewriteStream)input.TokenStream).Replace( 81 input.TreeAdaptor.GetTokenStartIndex(retval.Start), 82 input.TreeAdaptor.GetTokenStopIndex(retval.Start), 83 retval.Template); 84 <else> 85 ((TokenRewriteStream)input).Replace( 86 retval.Start.TokenIndex, 87 input.LT(-1).TokenIndex, 88 retval.Template); 89 <endif> 90 >> 91 92 rewriteTemplateAlt(it) ::= << 93 // <it.description> 94 <if(it.pred)> 95 if (<it.pred>) 96 { 97 retval.Template = <it.alt>; 98 }<\n> 99 <else> 100 { 101 retval.Template = <it.alt>; 102 }<\n> 103 <endif> 104 >> 105 106 rewriteEmptyTemplate(alts) ::= << 107 null; 108 >> 109 110 /** Invoke a template with a set of attribute name/value pairs. 111 * Set the value of the rule's template *after* having set 112 * the attributes because the rule's template might be used as 113 * an attribute to build a bigger template; you get a self-embedded 114 * template. 115 */ 116 rewriteExternalTemplate(name,args) ::= <% 117 TemplateGroup.GetInstanceOf("<name>"<optionalArguments(args)>) 118 %> 119 120 /** expr is a string expression that says what template to load */ 121 rewriteIndirectTemplate(expr,args) ::= <% 122 TemplateGroup.GetInstanceOf(<expr><optionalArguments(args)>) 123 %> 124 125 /** Invoke an inline template with a set of attribute name/value pairs */ 126 rewriteInlineTemplate(args, template) ::= <% 127 new StringTemplate(TemplateGroup, "<template>"<optionalArguments(args)>) 128 %> 129 130 optionalArguments(args) ::= << 131 <if(args)>, 132 new Dictionary\<string, object>() { <args:optionalArgument(); separator=", "> } 133 <endif> 134 >> 135 136 optionalArgument(it) ::= << 137 {"<it.name>", <it.value>} 138 >> 139 140 /** plain -> {foo} action */ 141 rewriteAction(action) ::= << 142 <action> 143 >> 144 145 /** An action has %st.attrName=expr; or %{st}.attrName=expr; */ 146 actionSetAttribute(st,attrName,expr) ::= << 147 (<st>).SetAttribute("<attrName>",<expr>); 148 >> 149 150 /** Translate %{stringExpr} */ 151 actionStringConstructor(stringExpr) ::= << 152 new StringTemplate(TemplateGroup,<stringExpr>) 153 >> 154