/* * [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. */ @outputFile.imports() ::= << <@super.imports()> using Antlr.Runtime.Tree; using RewriteRuleITokenStream = Antlr.Runtime.Tree.RewriteRuleTokenStream; >> @genericParser.members() ::= << <@super.members()> >> parserCtorBody() ::= << treeAdaptor = default(); CreateTreeAdaptor(ref treeAdaptor); TreeAdaptor = treeAdaptor ?? new CommonTreeAdaptor(); >> /** Add an adaptor property that knows how to build trees */ parserMembers() ::= << // Implement this function in your helper file to use a custom tree adaptor partial void CreateTreeAdaptor(ref adaptor); private adaptor; public TreeAdaptor { get { return adaptor; } set { this.adaptor = value; .TreeAdaptor = this.adaptor;}> } } >> treeAdaptorType() ::= << >> ruleReturnBaseType() ::= <% AstTreeParserRuleReturnScope\<, > %> /** Add a variable to track rule's return AST */ ruleDeclarations() ::= << root_0 = default();<\n> >> ruleLabelDefs(ruleDescriptor, labelType, ASTLabelType, rewriteElementType) ::= <% <[ruleDescriptor.tokenLabels,ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels] :{it|<\n> _tree = default();}> _tree = default();}> RewriteRuleStream stream_=new RewriteRuleStream(adaptor,"token ");}> RewriteRuleSubtreeStream stream_=new RewriteRuleSubtreeStream(adaptor,"rule ");}> %> /** When doing auto AST construction, we must define some variables; * These should be turned off if doing rewrites. This must be a "mode" * as a rule could have both rewrite and AST within the same alternative * block. */ @alt.declarations() ::= << root_0 = ()adaptor.Nil(); >> // T r a c k i n g R u l e E l e m e n t s /** ID and track it for use in a rewrite rule */ tokenRefTrack(token,label,elementIndex,terminalOptions) ::= << if () stream_.Add(