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
32324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercsharpVisibilityMap ::= [
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"private":"private",
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"protected":"protected",
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"public":"public",
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"fragment":"private",
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	default:"private"
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver]
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The overall file structure of a recognizer; stores methods for rules
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and cyclic DFAs plus support code.
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
43324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroutputFile(	LEXER,PARSER,TREE_PARSER, actionScope, actions,
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			docComment, recognizer,
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			name, tokens, tokenNames, rules, cyclicDFAs,
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			bitsets, buildTemplate, buildAST, rewriteMode, profile,
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			backtracking, synpreds, memoize, numRules,
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			fileName, ANTLRVersion, generatedTimestamp, trace,
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			scopes, superClass, literals) ::=
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//------------------------------------------------------------------------------
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// \<auto-generated>
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//     This code was generated by a tool.
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//     ANTLR Version: <ANTLRVersion>
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//     Changes to this file may cause incorrect behavior and will be lost if
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//     the code is regenerated.
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// \</auto-generated>
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//------------------------------------------------------------------------------
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR <ANTLRVersion> <fileName> <generatedTimestamp>
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(trace)>
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define ANTLR_TRACE
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@debugPreprocessor()>
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// The variable 'variable' is assigned but its value is never used.
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning disable 168, 219
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Unreachable code detected.
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning disable 162
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Missing XML comment for publicly visible type or member 'Type_or_Member'
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning disable 1591
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header>
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@imports>
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusing System.Collections.Generic;
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusing Antlr.Runtime;
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusing Antlr.Runtime.Misc;
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusing Antlr.Runtime.Tree;
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusing RewriteRuleITokenStream = Antlr.Runtime.Tree.RewriteRuleTokenStream;
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusing ConditionalAttribute = System.Diagnostics.ConditionalAttribute;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).namespace)>
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace <actions.(actionScope).namespace>
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<docComment>
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer>
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).namespace)>
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} // namespace <actions.(actionScope).namespace>
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
98324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerInputStreamType() ::= <<
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).inputStreamType; null="ICharStream">
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlexer(grammar, name, tokens, scopes, rules, numRules, filterMode, labelType="CommonToken",
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      superClass={<if(actions.(actionScope).superClass)><actions.(actionScope).superClass><else>Antlr.Runtime.Lexer<endif>}) ::= <<
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[System.CodeDom.Compiler.GeneratedCode("ANTLR", "<ANTLRVersion>")]
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[System.CLSCompliant(false)]
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<parserModifier(grammar=grammar, actions=actions)> partial class <grammar.recognizerName> : <@superClassName><superClass><@end>
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<tokens:{it|public const int <it.name; format="id">=<it.type>;}; separator="\n">
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<scopes:{it|<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<actions.lexer.members>
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // delegates
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <grammar.delegates:
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         {g|private <g.recognizerName> <g:delegateName()>;}; separator="\n">
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // delegators
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <grammar.delegators:
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         {g|private <g.recognizerName> <g:delegateName()>;}; separator="\n">
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <last(grammar.delegators):{g|private <g.recognizerName> gParent;}>
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<actions.(actionScope).ctorModifier; null="public"> <grammar.recognizerName>()<! needed by subclasses !>
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		OnCreated();
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<actions.(actionScope).ctorModifier; null="public"> <grammar.recognizerName>(<lexerInputStreamType()> input<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}> )
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		: this(input, new RecognizerSharedState()<grammar.delegators:{g|, <g:delegateName()>}>)
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<actions.(actionScope).ctorModifier; null="public"> <grammar.recognizerName>(<lexerInputStreamType()> input, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>)
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		: base(input, state)
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state.ruleMemo = new System.Collections.Generic.Dictionary\<int, int>[<numRules>+1];<\n><! index from 1..n !>
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<grammar.directDelegates:
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 {g|<g:delegateName()> = new <g.recognizerName>(input, this.state<trunc(g.delegators):{p|, <p:delegateName()>}>, this);}; separator="\n">
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<grammar.delegators:
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 {g|this.<g:delegateName()> = <g:delegateName()>;}; separator="\n">
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<last(grammar.delegators):{g|gParent = <g:delegateName()>;}>
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		OnCreated();
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public override string GrammarFileName { get { return "<fileName>"; } }
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly bool[] decisionCanBacktrack = new bool[0];
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.hasDelegates)>
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public override <lexerInputStreamType()> CharStream
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		get
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return base.CharStream;
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		set
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			base.CharStream = value;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			<grammar.directDelegates:
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			 {g|<g:delegateName()> = new <g.recognizerName>(input, state<trunc(g.delegators):{p|, <p:delegateName()>}>, this);}; separator="\n">
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			<grammar.delegators:
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			 {g|this.<g:delegateName()> = <g:delegateName()>;}; separator="\n">
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			<last(grammar.delegators):{g|gParent = <g:delegateName()>;}>
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)>
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<filteringNextToken()>
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	[Conditional("ANTLR_TRACE")]
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected virtual void OnCreated() {}
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	[Conditional("ANTLR_TRACE")]
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected virtual void EnterRule(string ruleName, int ruleIndex) {}
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	[Conditional("ANTLR_TRACE")]
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected virtual void LeaveRule(string ruleName, int ruleIndex) {}
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <rules; separator="\n">
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<insertLexerSynpreds(synpreds)>
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	#region DFA
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<cyclicDFAs:{dfa | DFA<dfa.decisionNumber> dfa<dfa.decisionNumber>;}; separator="\n">
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected override void InitDFAs()
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		base.InitDFAs();
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<cyclicDFAs:{dfa | dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>(this<if(dfa.specialStateSTs)>, SpecialStateTransition<dfa.decisionNumber><endif>);}; separator="\n">
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	#endregion
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A override of Lexer.nextToken() that backtracks over mTokens() looking
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for matches.  No error can be generated upon error; just rewind, consume
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  a token and then try again.  backtracking needs to be set as well.
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Make rule memoization happen only at levels above 1 as we start mTokens
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  at backtracking==1.
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
205324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringNextToken() ::= <<
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic override IToken NextToken()
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	while (true)
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if (input.LA(1) == CharStreamConstants.EndOfFile)
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			IToken eof = new CommonToken((ICharStream)input, CharStreamConstants.EndOfFile, TokenChannels.Default, input.Index, input.Index);
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			eof.Line = Line;
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			eof.CharPositionInLine = CharPositionInLine;
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return eof;
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state.token = null;
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state.channel = TokenChannels.Default;
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state.tokenStartCharIndex = input.Index;
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state.tokenStartCharPositionInLine = input.CharPositionInLine;
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state.tokenStartLine = input.Line;
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state.text = null;
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		try
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int m = input.Mark();
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			state.backtracking=1;<! means we won't throw slow exception !>
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			state.failed=false;
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			mTokens();
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			state.backtracking=0;
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			<! mTokens backtracks with synpred at backtracking==2
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			   and we set the synpredgate to allow actions at level 1. !>
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if (state.failed)
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				input.Rewind(m);
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				input.Consume();<! advance one char and try again !>
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			else
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				Emit();
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				return state.token;
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		catch (RecognitionException re)
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// shouldn't happen in backtracking mode, but...
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ReportError(re);
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Recover(re);
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic override void Memoize(IIntStream input, int ruleIndex, int ruleStartIndex)
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if (state.backtracking > 1)
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		base.Memoize(input, ruleIndex, ruleStartIndex);
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic override bool AlreadyParsedRule(IIntStream input, int ruleIndex)
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if (state.backtracking > 1)
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return base.AlreadyParsedRule(input, ruleIndex);
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return false;
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveractionGate() ::= "state.backtracking == 0"
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
269324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringActionGate() ::= "state.backtracking == 1"
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a parser */
272324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParser(grammar, name, scopes, tokens, tokenNames, rules, numRules,
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              bitsets, inputStreamType, superClass,
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              labelType, members, rewriteElementType,
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              filterMode, ASTLabelType="object") ::= <<
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[System.CodeDom.Compiler.GeneratedCode("ANTLR", "<ANTLRVersion>")]
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[System.CLSCompliant(false)]
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<parserModifier(grammar=grammar, actions=actions)> partial class <grammar.recognizerName> : <@superClassName><superClass><@end>
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	internal static readonly string[] tokenNames = new string[] {
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		"\<invalid>", "\<EOR>", "\<DOWN>", "\<UP>", <tokenNames; separator=", ">
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	};
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<tokens:{it|public const int <it.name; format="id">=<it.type>;}; separator="\n">
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegates)>
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// delegates
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<grammar.delegates:
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 {g|private <g.recognizerName> <g:delegateName()>;}; separator="\n">
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegators)>
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// delegators
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<grammar.delegators:
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 {g|private <g.recognizerName> <g:delegateName()>;}; separator="\n">
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<last(grammar.delegators):{g|private <g.recognizerName> gParent;}>
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<scopes:{it|<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@members()>
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public override string[] TokenNames { get { return <grammar.composite.rootGrammar.recognizerName>.tokenNames; } }
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public override string GrammarFileName { get { return "<fileName>"; } }
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<members>
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	[Conditional("ANTLR_TRACE")]
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected virtual void OnCreated() {}
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	[Conditional("ANTLR_TRACE")]
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected virtual void EnterRule(string ruleName, int ruleIndex) {}
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	[Conditional("ANTLR_TRACE")]
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected virtual void LeaveRule(string ruleName, int ruleIndex) {}
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	#region Rules
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<rules; separator="\n">
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	#endregion Rules
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegatedRules)>
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! generate rule/method definitions for imported rules so they
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   appear to be defined in this recognizer. !>
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	#region Delegated rules
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<grammar.delegatedRules:{ruleDescriptor|
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleModifier(grammar=grammar,ruleDescriptor=ruleDescriptor)> <returnType(ruleDescriptor)> <ruleDescriptor.name; format="id">(<ruleDescriptor.parameterScope:parameterScope()>) <!throws RecognitionException !>{ <if(ruleDescriptor.hasReturnValue)>return <endif><ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name; format="id">(<ruleDescriptor.parameterScope.attributes:{a|<a.name; format="id">}; separator=", ">); \}}; separator="\n">
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	#endregion Delegated rules
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<insertSynpreds(synpreds)>
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(cyclicDFAs)>
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	#region DFA
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<cyclicDFAs:{dfa | private DFA<dfa.decisionNumber> dfa<dfa.decisionNumber>;}; separator="\n">
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected override void InitDFAs()
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		base.InitDFAs();
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<cyclicDFAs:{dfa | dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>( this<if(dfa.specialStateSTs)>, SpecialStateTransition<dfa.decisionNumber><endif> );}; separator="\n">
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<cyclicDFAs:cyclicDFA()><! dump tables for all DFA !>
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	#endregion DFA
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(bitsets)>
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	#region Follow sets
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static class Follow
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<bitsets:{it|<bitset(name={_<it.name>_in_<it.inName><it.tokenIndex>}, words64=it.bits)>}; separator="\n">
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	#endregion Follow sets
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@genericParser.members() ::= <<
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#if ANTLR_DEBUG
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly bool[] decisionCanBacktrack =
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		new bool[]
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			false, // invalid decision
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			<grammar.decisions:{d | <d.dfa.hasSynPred>}; wrap="\n", separator=", ">
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		};
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#else
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly bool[] decisionCanBacktrack = new bool[0];
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! WARNING. bug in ST: this is cut-n-paste into Dbg.stg !>
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).ctorModifier; null="public"> <grammar.recognizerName>(<inputStreamType> input<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>)
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	: this(input, new RecognizerSharedState()<grammar.delegators:{g|, <g:delegateName()>}>)
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).ctorModifier; null="public"> <grammar.recognizerName>(<inputStreamType> input, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>)
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	: base(input, state)
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<parserCtorBody()>
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)>
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<grammar.directDelegates:
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 {g|<g:delegateName()> = new <g.recognizerName>(input, state<trunc(g.delegators):{p|, <p:delegateName()>}>, this);}; separator="\n">
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.indirectDelegates)>
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<grammar.indirectDelegates:{g | <g:delegateName()> = <g.delegator:delegateName()>.<g:delegateName()>;}; separator="\n">
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegators)>
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<last(grammar.delegators):{g|gParent = <g:delegateName()>;}>
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	OnCreated();
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// imported grammars are 'public' (can't be internal because their return scope classes must be accessible)
389324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparserModifier(grammar, actions) ::= <<
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)><actions.(actionScope).modifier; null="public"><else>public<endif>
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
393324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparserCtorBody() ::= <<
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthis.state.ruleMemo = new System.Collections.Generic.Dictionary\<int, int>[<length(grammar.allImportedRules)>+1];<\n><! index from 1..n !>
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<grammar.delegators:
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {g|this.<g:delegateName()> = <g:delegateName()>;}; separator="\n">
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser(grammar, name, scopes, tokens, tokenNames, rules, numRules, bitsets,
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver       ASTLabelType="object", superClass={<if(actions.(actionScope).superClass)><actions.(actionScope).superClass><else>Antlr.Runtime.Parser<endif>}, labelType="IToken",
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver       members={<actions.parser.members>}) ::= <<
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="ITokenStream", rewriteElementType="IToken", ...)>
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a tree parser; same as parser except the input
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  stream is a different type.
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
412324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertreeParser(grammar, name, scopes, tokens, tokenNames, globalAction, rules,
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           numRules, bitsets, filterMode, labelType={<ASTLabelType>}, ASTLabelType="object",
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           superClass={<if(actions.(actionScope).superClass)><actions.(actionScope).superClass><else>Antlr.Runtime.Tree.<if(filterMode)><if(buildAST)>TreeRewriter<else>TreeFilter<endif><else>TreeParser<endif><endif>},
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           members={<actions.treeparser.members>}) ::= <<
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="ITreeNodeStream", rewriteElementType="Node", ...)>
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simpler version of a rule template that is specific to the imaginary
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  rules created for syntactic predicates.  As they never have return values
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  nor parameters etc..., just give simplest possible method.  Don't do
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  any of the normal memoization stuff in here either; it's a waste.
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  As predicates cannot be inlined into the invoking rule, they need to
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  be in a rule by themselves.
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
426324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversynpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[Conditional("ANTLR_TRACE")]
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected virtual void EnterRule_<ruleName>_fragment() {}
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[Conditional("ANTLR_TRACE")]
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected virtual void LeaveRule_<ruleName>_fragment() {}
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start <ruleName>
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic <!final !>void <ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope()>)
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleLabelDefs()>
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	EnterRule_<ruleName>_fragment();
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	EnterRule("<ruleName>_fragment", <ruleDescriptor.index>);
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	TraceIn("<ruleName>_fragment", <ruleDescriptor.index>);
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	try
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<block>
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	finally
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		TraceOut("<ruleName>_fragment", <ruleDescriptor.index>);
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LeaveRule("<ruleName>_fragment", <ruleDescriptor.index>);
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LeaveRule_<ruleName>_fragment();
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end <ruleName>
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
454324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinsertLexerSynpreds(synpreds) ::= <<
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<insertSynpreds(synpreds)>
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
458324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinsertSynpreds(synpreds) ::= <<
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(synpreds)>
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#region Synpreds
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate bool EvaluatePredicate(System.Action fragment)
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	bool success = false;
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	state.backtracking++;
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@start()>
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	try { DebugBeginBacktrack(state.backtracking);
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int start = input.Mark();
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	try
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		fragment();
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	catch ( RecognitionException re )
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		System.Console.Error.WriteLine("impossible: "+re);
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	success = !state.failed;
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input.Rewind(start);
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	} finally { DebugEndBacktrack(state.backtracking, success); }
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@stop()>
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	state.backtracking--;
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	state.failed=false;
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return success;
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endregion Synpreds
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
488324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleMemoization(name) ::= <<
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (state.backtracking > 0 && AlreadyParsedRule(input, <ruleDescriptor.index>)) { <returnFromRule()> }
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to test for failure and return from rule */
495324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercheckRuleBacktrackFailure() ::= <<
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (state.failed) <returnFromRule()><endif>
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This rule has failed, exit indicating failure during backtrack */
500324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBacktrackFailure() ::= <<
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (state.backtracking>0) {state.failed=true; <returnFromRule()>}<endif>
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for a rule.  This includes any return type
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  data aggregates required for multiple return values.
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,finally,memoize) ::= <<
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScope(scope=ruleDescriptor.ruleScope)>
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnScope(ruleDescriptor.returnScope)>
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[Conditional("ANTLR_TRACE")]
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected virtual void EnterRule_<ruleName>() {}
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[Conditional("ANTLR_TRACE")]
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected virtual void LeaveRule_<ruleName>() {}
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start "<ruleName>"
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[GrammarRule("<ruleName>")]
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleModifier(grammar=grammar,ruleDescriptor=ruleDescriptor)> <returnType(ruleDescriptor)> <ruleName; format="id">(<ruleDescriptor.parameterScope:parameterScope()>)
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	EnterRule_<ruleName>();
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	EnterRule("<ruleName>", <ruleDescriptor.index>);
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	TraceIn("<ruleName>", <ruleDescriptor.index>);
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleScopeSetUp()>
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDeclarations()>
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleLabelDefs()>
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.actions.init>
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	try { DebugEnterRule(GrammarFileName, "<ruleName>");
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	DebugLocation(<ruleDescriptor.tree.line>, <ruleDescriptor.EORNode.charPositionInLine>);
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@preamble()>
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	try
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleMemoization(name=ruleName)>
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<block>
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleCleanUp()>
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<(ruleDescriptor.actions.after):execAction()>
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(exceptions)>
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!emptyRule)>
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).rulecatch)>
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<actions.(actionScope).rulecatch>
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	catch (RecognitionException re)
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ReportError(re);
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Recover(input,re);
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@setErrorReturnValue()>
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	finally
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		TraceOut("<ruleName>", <ruleDescriptor.index>);
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LeaveRule("<ruleName>", <ruleDescriptor.index>);
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LeaveRule_<ruleName>();
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <memoize()>
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleScopeCleanUp()>
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <finally>
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 	DebugLocation(<ruleDescriptor.EORNode.line>, <ruleDescriptor.EORNode.charPositionInLine>);
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	} finally { DebugExitRule(GrammarFileName, "<ruleName>"); }
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@postamble()>
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<returnFromRule()><\n>
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end "<ruleName>"
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// imported grammars need to have internal rules
572324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleModifier(grammar,ruleDescriptor) ::= <<
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)><csharpVisibilityMap.(ruleDescriptor.modifier); null="private"><else>internal<endif>
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// imported grammars need to have public return scopes
577324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScopeModifier(grammar,ruleDescriptor) ::= <<
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)><csharpVisibilityMap.(ruleDescriptor.modifier); null="private"><else>public<endif>
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch(decl,action) ::= <<
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch (<e.decl>)
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<e.action>
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
588324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarations() ::= <<
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnType(ruleDescriptor)> retval = new <returnType(ruleDescriptor)>();
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.Start = (<labelType>)input.LT(1);
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a |
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<a.type> <a.name; format="id"> = <if(a.initValue)><a.initValue><else><initValue(a.type)><endif>;
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}>
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <ruleDescriptor.name>_StartIndex = input.Index;
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
602324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeSetUp() ::= <<
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{it|<it>_stack.Push(new <it>_scope());<it>_scopeInit(<it>_stack.Peek());}; separator="\n">
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{it|<it.name>_stack.Push(new <it.name>_scope());<it.name>_scopeInit(<it.name>_stack.Peek());}; separator="\n">
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
607324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeCleanUp() ::= <<
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{it|<it>_scopeAfter(<it>_stack.Peek());<it>_stack.Pop();}; separator="\n">
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{it|<it.name>_scopeAfter(<it.name>_stack.Peek());<it.name>_stack.Pop();}; separator="\n">
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
612324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefs() ::= <<
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels,ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels]
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it|<labelType> <it.label.text> = default(<labelType>);}; separator="\n"
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.tokenListLabels
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it|List\<<labelType>\> list_<it.label.text> = null;}; separator="\n"
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.ruleListLabels,ruleDescriptor.wildcardTreeListLabels]
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it|List\<<ASTLabelType>\> list_<it.label.text> = null;}; separator="\n"
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n">
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleListLabels:ruleLabelDef(); separator="\n">
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
626324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelDefs() ::= <<
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.tokenListLabels,
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleLabels]
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it|<labelType> <it.label.text> = default(<labelType>);}; separator="\n"
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.charListLabels,
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.charLabels]
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	:{it|int <it.label.text> = 0;}; separator="\n"
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels]
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it|List\<<labelType>\> list_<it.label.text> = null;}; separator="\n"
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.charListLabels:{it|List\<int\> list_<it.label.text> = null;}; separator="\n"
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
644324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnFromRule() ::= <%
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverreturn
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasReturnValue)>
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! This comment is a hack to make sure the following
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   single space appears in the output. !> <ruleDescriptor.singleValueReturnName>
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<!!> retval
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver;
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
659324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= <<
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!TREE_PARSER)>
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.Stop = (<labelType>)input.LT(-1);
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermemoize() ::= <<
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (state.backtracking > 0) { Memoize(input, <ruleDescriptor.index>, <ruleDescriptor.name>_StartIndex); }
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a rule in the lexer; naked blocks are used for
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  fragment rules.
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
678324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[Conditional("ANTLR_TRACE")]
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected virtual void EnterRule_<ruleName>() {}
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[Conditional("ANTLR_TRACE")]
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected virtual void LeaveRule_<ruleName>() {}
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start "<ruleName>"
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[GrammarRule("<ruleName>")]
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleModifier(grammar=grammar,ruleDescriptor=ruleDescriptor)> void m<ruleName>(<ruleDescriptor.parameterScope:parameterScope()>)
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	EnterRule_<ruleName>();
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	EnterRule("<ruleName>", <ruleDescriptor.index>);
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	TraceIn("<ruleName>", <ruleDescriptor.index>);
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleScopeSetUp()>
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDeclarations()>
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		try
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nakedBlock)>
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleMemoization(name=ruleName)>
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<lexerRuleLabelDefs()>
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleDescriptor.actions.init>
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<block>
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int _type = <ruleName>;
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int _channel = DefaultTokenChannel;
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleMemoization(name=ruleName)>
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<lexerRuleLabelDefs()>
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleDescriptor.actions.init>
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<block>
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleCleanUp()>
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state.type = _type;
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state.channel = _channel;
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<(ruleDescriptor.actions.after):execAction()>
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	finally
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		TraceOut("<ruleName>", <ruleDescriptor.index>);
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LeaveRule("<ruleName>", <ruleDescriptor.index>);
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LeaveRule_<ruleName>();
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleScopeCleanUp()>
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <memoize()>
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end "<ruleName>"
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for the implicitly-defined lexer grammar rule
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  that chooses between lexer rules.
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
729324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic override void mTokens()
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<block><\n>
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// S U B R U L E S
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (...) subrule with multiple alternatives */
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverblock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint alt<decisionNumber>=<maxAlt>;
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@predecision()>
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertry { DebugEnterSubRule(<decisionNumber>);
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertry { DebugEnterDecision(<decisionNumber>, decisionCanBacktrack[<decisionNumber>]);
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decision>
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} finally { DebugExitDecision(<decisionNumber>); }
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postdecision()>
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prebranch()>
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch (alt<decisionNumber>)
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts:{a|<altSwitchCase(i,a)>}>
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} finally { DebugExitSubRule(<decisionNumber>); }
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postbranch()>
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A rule block with multiple alternatives */
760324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint alt<decisionNumber>=<maxAlt>;
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@predecision()>
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertry { DebugEnterDecision(<decisionNumber>, decisionCanBacktrack[<decisionNumber>]);
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decision>
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} finally { DebugExitDecision(<decisionNumber>); }
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postdecision()>
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch (alt<decisionNumber>)
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts:{a|<altSwitchCase(i,a)>}>
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
775324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
779324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDebugEnterAlt(1);
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A special case of a (...) subrule with a single alternative */
785324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverblockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
789324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDebugEnterAlt(1);
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)+ block with 1 or more alternatives */
795324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint cnt<decisionNumber>=0;
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertry { DebugEnterSubRule(<decisionNumber>);
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwhile (true)
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int alt<decisionNumber>=<maxAlt>;
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@predecision()>
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	try { DebugEnterDecision(<decisionNumber>, decisionCanBacktrack[<decisionNumber>]);
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<decision>
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	} finally { DebugExitDecision(<decisionNumber>); }
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@postdecision()>
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	switch (alt<decisionNumber>)
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<alts:{a|<altSwitchCase(i,a)>}>
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	default:
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if (cnt<decisionNumber> >= 1)
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			goto loop<decisionNumber>;
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleBacktrackFailure()>
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		EarlyExitException eee<decisionNumber> = new EarlyExitException( <decisionNumber>, input );
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		DebugRecognitionException(eee<decisionNumber>);
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<@earlyExitException()>
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		throw eee<decisionNumber>;
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cnt<decisionNumber>++;
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverloop<decisionNumber>:
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	;
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} finally { DebugExitSubRule(<decisionNumber>); }
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
831324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlockSingleAlt ::= positiveClosureBlock
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)* block with 1 or more alternatives */
834324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertry { DebugEnterSubRule(<decisionNumber>);
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwhile (true)
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int alt<decisionNumber>=<maxAlt>;
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@predecision()>
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	try { DebugEnterDecision(<decisionNumber>, decisionCanBacktrack[<decisionNumber>]);
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<decision>
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	} finally { DebugExitDecision(<decisionNumber>); }
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@postdecision()>
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	switch ( alt<decisionNumber> )
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<alts:{a|<altSwitchCase(i,a)>}>
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	default:
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		goto loop<decisionNumber>;
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverloop<decisionNumber>:
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	;
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} finally { DebugExitSubRule(<decisionNumber>); }
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
862324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlockSingleAlt ::= closureBlock
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Optional blocks (x)? are translated to (x|) by before code generation
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  so we can just use the normal block template
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
867324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlock ::= block
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
869324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlockSingleAlt ::= block
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A case in a switch that jumps to an alternative given the alternative
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  number.  A DFA predicts the alternative and then a simple switch
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  does the jump to the code that actually matches that alternative.
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
875324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraltSwitchCase(altNum,alt) ::= <<
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase <altNum>:
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@prealt()>
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	DebugEnterAlt(<altNum>);
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<alt>
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	break;<\n>
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An alternative is just a list of elements; at outermost level */
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@declarations()>
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<elements:element()>
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rew>
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@cleanup()>
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** What to emit when there is no rewrite.  For auto build
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  mode, does nothing.
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
897324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernoRewrite(rewriteBlockLevel, treeLevel) ::= ""
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// E L E M E N T S
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dump the elements one per line */
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelement(it) ::= <%
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prematch()>
904324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDebugLocation(<it.line>, <it.pos>);<\n>
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<it.el><\n>
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a token optionally with a label in front */
909324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex,terminalOptions) ::= <<
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label>=(<labelType>)<endif>Match(input,<token>,Follow._<token>_in_<ruleName><elementIndex>); <checkRuleBacktrackFailure()>
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID */
914324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)>
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)>
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
919324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelElem(label,elem,elemType) ::= <<
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (list_<label>==null) list_<label>=new List\<<elemType; null={<labelType>}>\>();
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlist_<label>.Add(<elem>);<\n>
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character */
925324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRef(char,label) ::= <<
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = input.LA(1);<\n>
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
929324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(<char>); <checkRuleBacktrackFailure()>
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character range */
933324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRangeRef(a,b,label) ::= <<
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = input.LA(1);<\n>
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
937324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatchRange(<a>,<b>); <checkRuleBacktrackFailure()>
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** For now, sets are interval tests and must be tested inline */
941324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,terminalOptions,elementIndex,postmatchCode="") ::= <<
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSetLabel()>
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (<s>)
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input.Consume();
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<postmatchCode>
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(!LEXER)>state.errorRecovery=false;<endif><if(backtracking)>state.failed=false;<endif>
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleBacktrackFailure()>
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	MismatchedSetException mse = new MismatchedSetException(null,input);
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	DebugRecognitionException(mse);
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@mismatchedSetException()>
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	Recover(mse);
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw mse;
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw mse;
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<! use following code to make it recover inline; remove throw mse;
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	recoverFromMismatchedSet(input,mse,Follow._set_in_<ruleName><elementIndex>);
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	!>
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
969324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetUnchecked(s,label,elementIndex,postmatchCode=false) ::= <%
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSetLabel()><\n>
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinput.Consume();<\n>
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(postmatchCode)>
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<postmatchCode><\n>
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)>state.errorRecovery=false;<endif><if(backtracking)>state.failed=false;<endif>
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
980324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetLabel() ::= <%
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>= input.LA(1);
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=(<labelType>)input.LT(1);
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
988324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchRuleBlockSet ::= matchSet
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
990324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)>
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)>
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a string literal */
996324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerStringRef(string,label,elementIndex) ::= <%
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>Start = CharIndex;<\n>
999324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(<string>); <checkRuleBacktrackFailure()><\n>
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>StartLine<elementIndex> = Line;<\n>
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>StartCharPos<elementIndex> = CharPositionInLine;<\n>
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = new <labelType>(input, TokenTypes.Invalid, TokenChannels.Default, <label>Start, CharIndex-1);<\n>
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>.Line = <label>StartLine<elementIndex>;<\n>
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>.CharPositionInLine = <label>StartCharPos<elementIndex>;
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(<string>); <checkRuleBacktrackFailure()><\n>
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(token,label,elementIndex,terminalOptions) ::= <<
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=(<labelType>)input.LT(1);<\n>
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatchAny(input); <checkRuleBacktrackFailure()>
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcard(...)>
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)>
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match . wildcard in lexer */
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardChar(label, elementIndex) ::= <<
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = input.LA(1);<\n>
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatchAny(); <checkRuleBacktrackFailure()>
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardCharListLabel(label, elementIndex) ::= <<
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcardChar(...)>
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)>
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a rule reference by invoking it possibly with arguments
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and a return value or values.  The 'rule' argument was the
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  target rule name, but now is type Rule, whose toString is
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  same: the rule name.  Now though you can access full rule
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  descriptor stuff.
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args,scope) ::= <<
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverPushFollow(Follow._<rule.name>_in_<ruleName><elementIndex>);
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label>=<endif><if(scope)><scope:delegateName()>.<endif><rule.name; format="id">(<args; separator=", ">);
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverPopFollow();
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=r */
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)>
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType={<ASTLabelType>},...)>
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A lexer rule reference.
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The 'rule' argument was the target rule name, but now
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is type Rule, whose toString is same: the rule name.
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Now though you can access full rule descriptor stuff.
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRef(rule,label,args,elementIndex,scope) ::= <%
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>Start<elementIndex> = CharIndex;<\n>
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>StartLine<elementIndex> = Line;<\n>
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>StartCharPos<elementIndex> = CharPositionInLine;<\n>
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope)><scope:delegateName()>.<endif>m<rule.name>(<args; separator=", ">); <checkRuleBacktrackFailure()><\n>
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = new <labelType>(input, TokenTypes.Invalid, TokenChannels.Default, <label>Start<elementIndex>, CharIndex-1);<\n>
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>.Line = <label>StartLine<elementIndex>;<\n>
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>.CharPositionInLine = <label>StartCharPos<elementIndex>;
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope)><scope:delegateName()>.<endif>m<rule.name>(<args; separator=", ">); <checkRuleBacktrackFailure()>
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** i+=INT in lexer */
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= <<
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<lexerRuleRef(...)>
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)>
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** EOF in the lexer */
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerMatchEOF(label,elementIndex) ::= <%
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>Start<elementIndex> = CharIndex;<\n>
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>StartLine<elementIndex> = Line;<\n>
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>StartCharPos<elementIndex> = CharPositionInLine;<\n>
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(EOF); <checkRuleBacktrackFailure()><\n>
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<labelType> <label> = new <labelType>(input, EOF, TokenChannels.Default, <label>Start<elementIndex>, CharIndex-1);<\n>
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>.Line = <label>StartLine<elementIndex>;<\n>
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>.CharPositionInLine = <label>StartCharPos<elementIndex>;
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(EOF); <checkRuleBacktrackFailure()>
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// used for left-recursive rules
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleDefArg()                       ::= "int <recRuleArg()>"
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleArg()                          ::= "_p"
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleAltPredicate(ruleName,opPrec)  ::= "<recRuleArg()> \<= <opPrec>"
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleSetResultAction()              ::= "root_0=$<ruleName>_primary.tree;"
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleSetReturnAction(src,name)      ::= "$<name>=$<src>.<name>;"
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match ^(root children) in tree parser */
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree(root, actionsAfterRoot, children, nullableChildList,
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     enclosingTreeLevel, treeLevel) ::= <<
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<root:element()>
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actionsAfterRoot:element()>
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nullableChildList)>
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (input.LA(1) == TokenTypes.Down)
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	Match(input, TokenTypes.Down, null); <checkRuleBacktrackFailure()>
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<children:element()>
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	Match(input, TokenTypes.Up, null); <checkRuleBacktrackFailure()>
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(input, TokenTypes.Down, null); <checkRuleBacktrackFailure()>
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<children:element()>
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(input, TokenTypes.Up, null); <checkRuleBacktrackFailure()>
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Every predicate is used as a validating predicate (even when it is
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  also hoisted into a prediction expression).
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvervalidateSemanticPredicate(pred,description) ::= <<
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (!(<evalPredicate(...)>))
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleBacktrackFailure()>
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw new FailedPredicateException(input, "<ruleName>", "<description>");
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (if-then-else)
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber> = <eotPredictsAlt>;
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleBacktrackFailure()>
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	NoViableAltException nvae = new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input);
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	DebugRecognitionException(nvae);
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@noViableAltException()>
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw nvae;
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Same as a normal DFA state except that we don't examine lookahead
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for the bypass alternative.  It delays error detection but this
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is faster, smaller, and more what people expect.  For (X)? people
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  expect "if ( LA(1)==X ) match(X);" and that's it.
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state that is actually the loopback decision of a closure
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  loop.  If end-of-token (EOT) predicts any of the targets then it
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  should act like a default clause (i.e., no error can be generated).
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This is used only in the lexer so that for ('a')* on the end of a rule
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  anything other than 'a' predicts exiting.
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse "><\n>
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!edges)>
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt<decisionNumber> = <eotPredictsAlt>;<! if no edges, don't gen ELSE !>
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber> = <eotPredictsAlt>;
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An accept state indicates a unique alternative has been predicted */
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaAcceptState(alt) ::= "alt<decisionNumber> = <alt>;"
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simple edge with an expression.  If the expression is satisfied,
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  enter to the target state.  To handle gated productions, we may
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  have to evaluate some predicates for this edge.
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdge(labelExpr, targetState, predicates) ::= <<
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ((<labelExpr>)<if(predicates)> && (<predicates>)<endif>)
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<targetState>
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (switch case)
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state where a SWITCH may be generated.  The code generator
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  decides if this is possible: CodeGenerator.canGenerateSwitch().
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch (input.LA(<k>))
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n">
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault:
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber>=<eotPredictsAlt>;
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	break;<\n>
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleBacktrackFailure()>
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		NoViableAltException nvae = new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input);
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		DebugRecognitionException(nvae);
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<@noViableAltException()>
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		throw nvae;
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch (input.LA(<k>))
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n">
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch (input.LA(<k>))
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n">
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault:
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber>=<eotPredictsAlt>;
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	break;<\n>
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdgeSwitch(labels, targetState) ::= <<
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<labels:{it|case <it>:}; separator="\n">
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<targetState>
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	break;
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// C y c l i c  D F A
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The code to initiate execution of a cyclic DFA; this is used
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in the rule to predict an alt just like the fixed DFA case.
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The <name> attribute is inherited via the parser, lexer, ...
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaDecision(decisionNumber,description) ::= <<
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertry
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber> = dfa<decisionNumber>.Predict(input);
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch (NoViableAltException nvae)
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	DebugRecognitionException(nvae);
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw;
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Dump DFA tables as run-length-encoded Strings of octal values.
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Can't use hex as compiler translates them before compilation.
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * These strings are split into multiple, concatenated strings.
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Java puts them back together at compile time thankfully.
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Java cannot handle large static arrays, so we're stuck with this
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * encode/decode approach.  See analysis and runtime DFA for
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the encoding methods.
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFA(dfa) ::= <<
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate class DFA<dfa.decisionNumber> : DFA
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private const string DFA<dfa.decisionNumber>_eotS =
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		"<dfa.javaCompressedEOT; wrap="\"+\n\t\t\"">";
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private const string DFA<dfa.decisionNumber>_eofS =
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		"<dfa.javaCompressedEOF; wrap="\"+\n\t\t\"">";
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private const string DFA<dfa.decisionNumber>_minS =
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		"<dfa.javaCompressedMin; wrap="\"+\n\t\t\"">";
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private const string DFA<dfa.decisionNumber>_maxS =
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		"<dfa.javaCompressedMax; wrap="\"+\n\t\t\"">";
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private const string DFA<dfa.decisionNumber>_acceptS =
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		"<dfa.javaCompressedAccept; wrap="\"+\n\t\t\"">";
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private const string DFA<dfa.decisionNumber>_specialS =
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		"<dfa.javaCompressedSpecial; wrap="\"+\n\t\t\"">}>";
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly string[] DFA<dfa.decisionNumber>_transitionS =
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			<dfa.javaCompressedTransition:{s|"<s; wrap="\"+\n\"">"}; separator=",\n">
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		};
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly short[] DFA<dfa.decisionNumber>_eot = DFA.UnpackEncodedString(DFA<dfa.decisionNumber>_eotS);
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly short[] DFA<dfa.decisionNumber>_eof = DFA.UnpackEncodedString(DFA<dfa.decisionNumber>_eofS);
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly char[] DFA<dfa.decisionNumber>_min = DFA.UnpackEncodedStringToUnsignedChars(DFA<dfa.decisionNumber>_minS);
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly char[] DFA<dfa.decisionNumber>_max = DFA.UnpackEncodedStringToUnsignedChars(DFA<dfa.decisionNumber>_maxS);
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly short[] DFA<dfa.decisionNumber>_accept = DFA.UnpackEncodedString(DFA<dfa.decisionNumber>_acceptS);
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly short[] DFA<dfa.decisionNumber>_special = DFA.UnpackEncodedString(DFA<dfa.decisionNumber>_specialS);
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	private static readonly short[][] DFA<dfa.decisionNumber>_transition;
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	static DFA<dfa.decisionNumber>()
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int numStates = DFA<dfa.decisionNumber>_transitionS.Length;
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		DFA<dfa.decisionNumber>_transition = new short[numStates][];
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for ( int i=0; i \< numStates; i++ )
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			DFA<dfa.decisionNumber>_transition[i] = DFA.UnpackEncodedString(DFA<dfa.decisionNumber>_transitionS[i]);
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public DFA<dfa.decisionNumber>( BaseRecognizer recognizer<if(dfa.specialStateSTs)>, SpecialStateTransitionHandler specialStateTransition<endif> )
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)>
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		: base(specialStateTransition)
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		this.recognizer = recognizer;
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		this.decisionNumber = <dfa.decisionNumber>;
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		this.eot = DFA<dfa.decisionNumber>_eot;
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		this.eof = DFA<dfa.decisionNumber>_eof;
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		this.min = DFA<dfa.decisionNumber>_min;
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		this.max = DFA<dfa.decisionNumber>_max;
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		this.accept = DFA<dfa.decisionNumber>_accept;
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		this.special = DFA<dfa.decisionNumber>_special;
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		this.transition = DFA<dfa.decisionNumber>_transition;
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public override string Description { get { return "<dfa.description>"; } }
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public override void Error(NoViableAltException nvae)
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		DebugRecognitionException(nvae);
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)>
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate int SpecialStateTransition<dfa.decisionNumber>(DFA dfa, int s, IIntStream _input)<! throws NoViableAltException!>
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(LEXER)>
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	IIntStream input = _input;
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<endif>
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(PARSER)>
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ITokenStream input = (ITokenStream)_input;
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<endif>
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(TREE_PARSER)>
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ITreeNodeStream input = (ITreeNodeStream)_input;
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<endif>
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int _s = s;
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	switch (s)
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.specialStateSTs:{state |
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	case <i0>:<! compressed special state numbers 0..n-1 !>
1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<state>}; separator="\n">
1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if (state.backtracking > 0) {state.failed=true; return -1;}
1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	NoViableAltException nvae = new NoViableAltException(dfa.Description, <dfa.decisionNumber>, _s, input);
1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	dfa.Error(nvae);
1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw nvae;
1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A state in a cyclic DFA; it's a special state and part of a big switch on
1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state.
1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1367324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint LA<decisionNumber>_<stateNumber> = input.LA(1);<\n>
1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(semPredState)>
1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! get next lookahead symbol to test edges, then rewind !>
1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>int index<decisionNumber>_<stateNumber> = input.Index;
1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinput.Rewind();
1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvers = -1;
1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">
1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(semPredState)>
1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! return input cursor to state before we rewound !>
1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>input.Seek(index<decisionNumber>_<stateNumber>);
1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (s >= 0) return s;
1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbreak;
1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Just like a fixed DFA edge, test the lookahead and indicate what
1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state to jump to next if successful.
1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1387324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ((<labelExpr>)<if(predicates)> && (<predicates>)<endif>) {s = <targetStateNumber>;}<\n>
1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An edge pointing at end-of-token; essentially matches any char;
1392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  always jump to the target.
1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1394324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvereotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= <<
1395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvers = <targetStateNumber>;<\n>
1396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// D F A  E X P R E S S I O N S
1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1401324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverandPredicates(left,right) ::= "(<left>&&<right>)"
1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1403324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverorPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
1404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1405324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernotPredicate(pred) ::= "!(<evalPredicate(...)>)"
1406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1407324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalPredicate(pred,description) ::= "(<pred>)"
1408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1409324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalSynPredicate(pred,description) ::= "EvaluatePredicate(<pred>_fragment)"
1410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1411324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber>==<atom>"
1412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
1414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  somewhere.  Must ask for the lookahead directly.
1415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1416324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadTest(atom,k,atomAsInt) ::= "input.LA(<k>)==<atom>"
1417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1418324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <%
1419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(LA<decisionNumber>_<stateNumber><ge()><lower> && LA<decisionNumber>_<stateNumber><le()><upper>)
1420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1422324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(input.LA(<k>)<ge()><lower> && input.LA(<k>)<le()><upper>)"
1423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverle() ::= "\<="
1425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverge() ::= ">="
1426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1427324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTest(ranges) ::= <<
1428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ranges; separator="||">
1429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// A T T R I B U T E S
1432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1433324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverattributeScope(scope) ::= <<
1434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected sealed partial class <scope.name>_scope
1436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<scope.attributes:{it|public <it.decl>;}; separator="\n">
1438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.actions.scopeinit)>
1440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected void <scope.name>_scopeInit( <scope.name>_scope scope )
1441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<scope.actions.scopeinit>
1443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected virtual void <scope.name>_scopeInit( <scope.name>_scope scope ) {}
1446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.actions.scopeafter)>
1448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected void <scope.name>_scopeAfter( <scope.name>_scope scope )
1449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<scope.actions.scopeafter>
1451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected virtual void <scope.name>_scopeAfter( <scope.name>_scope scope ) {}
1454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected readonly ListStack\<<scope.name>_scope\> <scope.name>_stack = new ListStack\<<scope.name>_scope\>();
1456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1459324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScope(scope) ::= <<
1460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attributeScope(...)>
1461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1463324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScope(scope) ::= <<
1464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attributeScope(...)>
1465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1467324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnStructName(it) ::= "<it.name>_return"
1468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1469324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnType(ruleDescriptor) ::= <%
1470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.returnScope.attributes && ruleDescriptor.hasMultipleReturnValues)>
1471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleDescriptor.grammar.recognizerName>.<ruleDescriptor:returnStructName()>
1472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<elseif(ruleDescriptor.hasMultipleReturnValues)>
1473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleReturnBaseType()>
1474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<elseif(ruleDescriptor.hasSingleReturnValue)>
1475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleDescriptor.singleValueReturnType>
1476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void
1478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Generate the C# type associated with a single or multiple return
1482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  values.
1483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1484324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelType(referencedRule) ::= <%
1485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.returnScope.attributes&&referencedRule.hasMultipleReturnValues)>
1486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<referencedRule.grammar.recognizerName>.<referencedRule:returnStructName()>
1487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<elseif(referencedRule.hasMultipleReturnValues)>
1488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleReturnBaseType()>
1489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<elseif(referencedRule.hasSingleReturnValue)>
1490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<referencedRule.singleValueReturnType>
1491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void
1493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1496324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateName(it) ::= <<
1497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(it.label)><it.label><else>g<it.name><endif>
1498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Using a type to init value map, try to init a type; if not in table
1501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  must be an object, default value is "null".
1502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1503324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinitValue(typeName) ::= <<
1504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault(<typeName>)
1505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a rule label including default value */
1508324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDef(label) ::= <%
1509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleLabelType(referencedRule=label.referencedRule)> <label.label.text> = <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;
1510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a return struct for a rule if the code needs to access its
1513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  start/stop tokens, tree stuff, attributes, ...  Leave a hole for
1514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  subgroups to stick in members.
1515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1516324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScope(scope) ::= <<
1517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes && ruleDescriptor.hasMultipleReturnValues)>
1518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnScopeModifier(grammar=grammar,ruleDescriptor=ruleDescriptor)> sealed partial class <ruleDescriptor:returnStructName()> : <ruleReturnBaseType()><@ruleReturnInterfaces()>
1519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<scope.attributes:{it|public <it.decl>;}; separator="\n">
1521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@ruleReturnMembers()>
1522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1526324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleReturnBaseType() ::= <%
1527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope\<<labelType>>
1528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@returnScope.ruleReturnMembers() ::= <<
1531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1533324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterScope(scope) ::= <<
1534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{it|<it.decl>}; separator=", ">
1535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1537324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterAttributeRef(attr) ::= <<
1538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name; format="id">
1539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1541324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterSetAttributeRef(attr,expr) ::= <<
1542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name; format="id"> =<expr>;
1543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1545324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeAttributeRef(scope,attr,index,negIndex) ::= <%
1546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>_stack[<scope>_stack.Count - <negIndex> - 1].<attr.name; format="id">
1548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>_stack[<index>].<attr.name; format="id">
1551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>_stack.Peek().<attr.name; format="id">
1553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1557324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeSetAttributeRef(scope,attr,expr,index,negIndex) ::= <%
1558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>_stack[<scope>_stack.Count - <negIndex> - 1].<attr.name; format="id"> = <expr>;
1560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>_stack[<index>].<attr.name; format="id"> = <expr>;
1563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>_stack.Peek().<attr.name; format="id"> = <expr>;
1565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $x is either global scope or x is rule with dynamic scope; refers
1570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  to stack itself not top of stack.  This is useful for predicates
1571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  like {$function.Count>0 && $function::name.Equals("foo")}?
1572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1573324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedDynamicScopeRef(scope) ::= "<scope>_stack"
1574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** reference an attribute of rule; might only have single return value */
1576324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelRef(referencedRule,scope,attr) ::= <%
1577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
1578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>!=null?<scope>.<attr.name; format="id">:<initValue(attr.type)>)
1579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>
1581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1584324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnAttributeRef(ruleDescriptor,attr) ::= <%
1585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.<attr.name; format="id">
1587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name; format="id">
1589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1592324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnSetAttributeRef(ruleDescriptor,attr,expr) ::= <%
1593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.<attr.name; format="id"> =<expr>;
1595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name; format="id"> =<expr>;
1597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to translate $tokenLabel */
1601324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelRef(label) ::= "<label>"
1602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID {$ids} or e+=expr {$e} */
1604324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelRef(label) ::= "list_<label>"
1605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// not sure the next are the right approach
1608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1609324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_text(scope,attr) ::= "(<scope>!=null?<scope>.Text:null)"
1610324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_type(scope,attr) ::= "(<scope>!=null?<scope>.Type:0)"
1611324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_line(scope,attr) ::= "(<scope>!=null?<scope>.Line:0)"
1612324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_pos(scope,attr) ::= "(<scope>!=null?<scope>.CharPositionInLine:0)"
1613324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_channel(scope,attr) ::= "(<scope>!=null?<scope>.Channel:0)"
1614324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_index(scope,attr) ::= "(<scope>!=null?<scope>.TokenIndex:0)"
1615324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_tree(scope,attr) ::= "<scope>_tree"
1616324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_int(scope,attr) ::= "(<scope>!=null?int.Parse(<scope>.Text):0)"
1617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1618324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_start(scope,attr) ::= "(<scope>!=null?((<labelType>)<scope>.Start):default(<labelType>))"
1619324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_stop(scope,attr) ::= "(<scope>!=null?((<labelType>)<scope>.Stop):default(<labelType>))"
1620324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_tree(scope,attr) ::= "(<scope>!=null?((<ASTLabelType>)<scope>.Tree):default(<ASTLabelType>))"
1621324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_text(scope,attr) ::= <%
1622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
1623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>!=null?(input.TokenStream.ToString(
1624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.TreeAdaptor.GetTokenStartIndex(<scope>.Start),
1625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.TreeAdaptor.GetTokenStopIndex(<scope>.Start))):null)
1626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>!=null?input.ToString(<scope>.Start,<scope>.Stop):null)
1628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1631324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_st(scope,attr) ::= "(<scope>!=null?<scope>.Template:null)"
1632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Isolated $RULE ref ok in lexer as it's a Token */
1634324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabel(label) ::= "<label>"
1635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1636324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_type(scope,attr) ::=
1637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "(<scope>!=null?<scope>.Type:0)"
1638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1639324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_line(scope,attr) ::=
1640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "(<scope>!=null?<scope>.Line:0)"
1641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1642324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_pos(scope,attr) ::=
1643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "(<scope>!=null?<scope>.CharPositionInLine:-1)"
1644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1645324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_channel(scope,attr) ::=
1646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "(<scope>!=null?<scope>.Channel:0)"
1647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1648324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_index(scope,attr) ::=
1649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "(<scope>!=null?<scope>.TokenIndex:0)"
1650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1651324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_text(scope,attr) ::=
1652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "(<scope>!=null?<scope>.Text:null)"
1653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1654324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_int(scope,attr) ::=
1655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "(<scope>!=null?int.Parse(<scope>.Text):0)"
1656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Somebody may ref $template or $tree or $stop within a rule:
1658324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_start(scope,attr) ::= "retval.Start"
1659324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_stop(scope,attr) ::= "retval.Stop"
1660324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_tree(scope,attr) ::= "retval.Tree"
1661324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_text(scope,attr) ::= <%
1662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
1663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinput.TokenStream.ToString(
1664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.TreeAdaptor.GetTokenStartIndex(retval.Start),
1665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.TreeAdaptor.GetTokenStopIndex(retval.Start))
1666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinput.ToString(retval.Start,input.LT(-1))
1668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1670324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_st(scope,attr) ::= "retval.Template"
1671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1672324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_text(scope,attr) ::= "Text"
1673324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_type(scope,attr) ::= "_type"
1674324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_line(scope,attr) ::= "state.tokenStartLine"
1675324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_pos(scope,attr) ::= "state.tokenStartCharPositionInLine"
1676324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_index(scope,attr) ::= "-1" // undefined token index in lexer
1677324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_channel(scope,attr) ::= "_channel"
1678324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_start(scope,attr) ::= "state.tokenStartCharIndex"
1679324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_stop(scope,attr) ::= "(CharIndex-1)"
1680324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_int(scope,attr) ::= "int.Parse(<scope>.Text)"
1681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// setting $st and $tree is allowed in local rule. everything else
1683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// is flagged as error
1684324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_tree(scope,attr,expr) ::= "retval.Tree = <expr>;"
1685324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_st(scope,attr,expr) ::= "retval.Template =<expr>;"
1686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to execute an action (only when not backtracking) */
1688324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecAction(action) ::= <%
1689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (<actions.(actionScope).synpredgate>)<\n>
1691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{<\n>
1692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@indentedAction()><\n>
1693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<action>
1696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@execAction.indentedAction() ::= <<
1700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<action>
1701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to always execute an action even when backtracking */
1704324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecForcedAction(action) ::= "<action>"
1705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// M I S C (properties, etc...)
1707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbitset(name, words64) ::= <<
1709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic static readonly BitSet <name> = new BitSet(new ulong[]{<words64:{it|<it>UL};separator=",">});
1710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1712324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercodeFileExtension() ::= ".cs"
1713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertrue_value() ::= "true"
1715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfalse_value() ::= "false"
1716