1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* [The "BSD license"]
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2008 Erik van Bilsen
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2007-2008 Johannes Luber
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2005-2007 Kunle Odutola
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2005-2006 Terence Parr
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver All rights reserved.
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Redistribution and use in source and binary forms, with or without
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modification, are permitted provided that the following conditions
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver are met:
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1. Redistributions of source code must retain the above copyright
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer.
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2. Redistributions in binary form must reproduce the above copyright
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer in the
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    documentation and/or other materials provided with the distribution.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3. The name of the author may not be used to endorse or promote products
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    derived from this software without specific prior written permission.
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvergroup Delphi;
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercsharpTypeInitMap ::= [
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "int":"0",
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "uint":"0",
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "long":"0",
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "ulong":"0",
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "float":"0.0",
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "double":"0.0",
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "bool":"False",
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "byte":"0",
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "sbyte":"0",
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "short":"0",
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "ushort":"0",
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "char":"#0",
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "string":"''",
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  "String":"''",
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  default:"nil" // anything other than an atomic type
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver]
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The overall file structure of a recognizer; stores methods for rules
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and cyclic DFAs plus support code.
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  LEXER (Boolean): should we generate lexer code?
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  PARSER (Boolean): should we generate parser code?
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  TREE_PARSER (Boolean): should we generate tree parser code?
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  actionScope (String): 'lexer', 'parser', 'tree_parser' or custom scope
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  actions (HashMap):
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  docComment (String): document comment
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  recognizer (Object): recognizer class generator
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  name (String): name of grammar
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  tokens (HashMap<name: String, type: Integer>):
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  tokenNames:
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  rules:
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  cyclicDFAs:
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  bitsets:
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  buildTemplate (Boolean): should we generate a string template?
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  buildAST (Boolean): should we generate an AST?
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  rewriteMode (Boolean): are we rewriteing nodes?
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  profile (Boolean):
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  backtracking (Boolean): backtracking mode?
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  synpreds (): syntactic predicates
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  memoize (Boolean): should we memoize?
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  numRules (Integer): number of rules
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  fileName (String): fully qualified name of original .g file
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  ANTLRVersion (String): ANTLR version in Major.Minor.Build format
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  generatedTimestamp (String): date/time when the file is generated
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  trace (Boolean): should we trace input/output?
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  scopes:
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  superClass (String): name of base class, or empty string
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  literals:
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
81324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroutputFile(LEXER,PARSER,TREE_PARSER, actionScope, actions,
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           docComment, recognizer,
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           name, tokens, tokenNames, rules, cyclicDFAs,
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     bitsets, buildTemplate, buildAST, rewriteMode, profile,
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     backtracking, synpreds, memoize, numRules,
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     fileName, ANTLRVersion, generatedTimestamp, trace,
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     scopes, superClass, literals) ::=
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverunit <name>;
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{$HINTS OFF}
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR <ANTLRVersion> <fileName> <generatedTimestamp>
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header>
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinterface
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@imports>
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruses<\n>
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <actions.(actionScope).usesInterface>
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime.Tree,<\n>
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime,
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime.Collections,
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime.Tools;
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<docComment>
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer>
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Generates source code for the lexer class
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammar (Grammar object)
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlexer(grammar, name, tokens, scopes, rules, numRules, labelType="Token",
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      filterMode, superClass="Lexer") ::= <<
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I<grammar.recognizerName> = interface(I<@superClassName><superClass><@end>)
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T<grammar.recognizerName> = class(T<@superClassName><superClass><@end>, I<grammar.recognizerName>)
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FCnt: array [0..<grammar.numberOfDecisions>] of Byte;
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLA: array [0..<grammar.numberOfDecisions>, 0..255] of Integer;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FException: ERecognitionException;
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InitializeCyclicDFAs;
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <cyclicDFAs:cyclicDFADeclaration()>
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <tokens:{<it.name> = <it.type>;}; separator="\n">
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <actions.(actionScope).memberDeclarations>
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // delegates
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <grammar.delegates: {g|<g:delegateName()>: I<superClass>; {<g.recognizerName>}}; separator="\n">
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // delegators
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <grammar.delegators: {g|<g:delegateName()>: Pointer; {<g.recognizerName>}}; separator="\n">
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <last(grammar.delegators):{g|gParent: Pointer; {<g.recognizerName>}}>
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IBaseRecognizer }
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetGrammarFileName: String; override;
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)>
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function AlreadyParsedRule(const Input: IIntStream;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const RuleIndex: Integer): Boolean; override;
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Memoize(const Input: IIntStream; const RuleIndex,
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      RuleStartIndex: Integer); override;
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ILexer }
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function NextToken: IToken; override;<\n>
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ILexer }
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DoTokens; override;
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create; overload;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: ICharStream<grammar.delegators:{g|; const A<g:delegateName()>: IBaseRecognizer{<g.recognizerName>}}>); overload;
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: ICharStream; const AState: IRecognizerSharedState<grammar.delegators:{g|; const A<g:delegateName()>: IBaseRecognizer{<g.recognizerName>}}>); overload;
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <rules: {r | <if(!r.ruleDescriptor.isSynPred)><lexerRuleDeclaration(r)><endif>}>
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <synpreds:{p | <lexerSynpredDeclaration(p)>}; separator="\n">
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimplementation
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruses
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <grammar.delegates: {g|<g.recognizerName>,}; separator="\n">
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <grammar.delegators: {g|<g.recognizerName>,}; separator="\n">
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <actions.(actionScope).usesImplementation>
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SysUtils,
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StrUtils,
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Math;
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ T<grammar.recognizerName> }
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor T<grammar.recognizerName>.Create;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InitializeCyclicDFAs;
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor T<grammar.recognizerName>.Create(const AInput: ICharStream<grammar.delegators:{g|; const A<g:delegateName()>: IBaseRecognizer{<g.recognizerName>}}>);
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(AInput, nil<grammar.delegators:{g|, A<g:delegateName()>}>);
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor T<grammar.recognizerName>.Create(const AInput: ICharStream; const AState: IRecognizerSharedState<grammar.delegators:{g|; const A<g:delegateName()>: IBaseRecognizer{<g.recognizerName>}}>);
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AInput, AState);
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InitializeCyclicDFAs; { TODO: Necessary in Delphi??? Not removed yet. }
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <if(memoize)>
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <if(grammar.grammarIsRoot)>
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State.RuleMemoCount := <numRules>+1;<\n> <! index from 1..n !>
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <endif>
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <endif>
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <grammar.directDelegates:
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   {g|<g:delegateName()> := T<g.recognizerName>.Create(AInput, State<trunc(g.delegators):{p|, <p:delegateName()>}>, Self);}; separator="\n">
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <grammar.delegators:
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   {g|<g:delegateName()> := Pointer(A<g:delegateName()>);}; separator="\n">
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <last(grammar.delegators):{g|gParent := Pointer(A<g:delegateName()>);}>
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <actions.(actionScope).memberInitializations>
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).memberImplementations>
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.GetGrammarFileName: String;
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := '<fileName>';
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)>
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<filteringNextToken()>
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules; separator="\n\n">
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpreds:{p | <lexerSynpred(p)>}>
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure T<grammar.recognizerName>.InitializeCyclicDFAs;
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <cyclicDFAs:{dfa | FDFA<dfa.decisionNumber> := TDFA<dfa.decisionNumber>.Create(Self<@debugAddition()>);}; separator="\n">
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <cyclicDFAs:{dfa | <if(dfa.specialStateSTs)>FDFA<dfa.decisionNumber>.SpecialStateTransitionHandler := DFA<dfa.decisionNumber>_SpecialStateTransition;<endif>}; separator="\n">
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend.>>
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
227324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleDeclaration(rule) ::= <<
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure m<rule.ruleName>(<rule.ruleDescriptor.parameterScope:parameterScope(scope=rule)>);<\n>
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A override of Lexer.nextToken() that backtracks over mTokens() looking
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for matches.  No error can be generated upon error; just rewind, consume
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  a token and then try again.  backtracking needs to be set as well.
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Make rule memoization happen only at levels above 1 as we start mTokens
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  at backtracking==1.
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
238324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringNextToken() ::= <<
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.NextToken: IToken;
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M: Integer;
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (True) do
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Input.LA(1) = Integer(cscEOF)) then
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Exit(TToken.EOF_TOKEN);
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    State.Token := nil;
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    State.Channel := TToken.DEFAULT_CHANNEL;
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    State.TokenStartCharIndex := Input.Index;
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    State.TokenStartCharPositionInLine := Input.CharPositionInLine;
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    State.TokenStartLine := Input.Line;
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    State.Text := '';
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      M := Input.Mark();
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      State.Backtracking := 1; <! means we won't throw slow exception !>
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      State.Failed := False;
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      mTokens();
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      State.Backtracking := 0;
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<!
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      mTokens backtracks with synpred at backtracking==2
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            and we set the synpredgate to allow actions at level 1.
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver!>
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (State.Failed) then
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Input.Rewind(M);
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Input.Consume; <! // advance one char and try again !>
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Emit;
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Exit(State.Token);
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    except
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      on RE: ERecognitionException do
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // shouldn't happen in backtracking mode, but...
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ReportError(RE);
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Recover(RE);
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.AlreadyParsedRule(const Input: IIntStream;
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const RuleIndex: Integer): Boolean;
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (State.Backtracking > 1) then
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := inherited AlreadyParsedRule(Input, RuleIndex)
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := False;
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure T<grammar.recognizerName>.Memoize(const Input: IIntStream; const RuleIndex,
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RuleStartIndex: Integer);
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (State.Backtracking > 1) then
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inherited Memoize(Input, RuleIndex, RuleStartIndex);
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
303324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringActionGate() ::= "(State.Backtracking = 1)"
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a parser */
306324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParser(grammar, name, scopes, tokens, tokenNames, rules, numRules,
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              bitsets, inputStreamType, superClass, filterMode,
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ASTLabelType="ANTLRInterface", labelType, members, rewriteElementType) ::= <<
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <rules: {r | <genericParserRuleReturnType(rule=r, ruleDescriptor=r.ruleDescriptor)>}>
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I<grammar.recognizerName> = interface(I<@superClassName><superClass><@end>)
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <rules: {r | <genericParserRuleInterface(rule=r, ruleDescriptor=r.ruleDescriptor)>}>
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T<grammar.recognizerName> = class(T<@superClassName><superClass><@end>, I<grammar.recognizerName>)
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TOKEN_NAMES: array [0..<length(tokenNames)>+3] of String = (
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        '\<invalid>',
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        '\<EOR>',
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        '\<DOWN>',
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        '\<UP>',
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <tokenNames; separator=",\n">);<\n>
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <tokens:{<it.name> = <it.type>;}; separator="\n">
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // delegates
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <grammar.delegates: {g|<g:delegateName()>: I<superClass>; {<g.recognizerName>}}; separator="\n">
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // delegators
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <grammar.delegators: {g|<g:delegateName()>: Pointer; {<g.recognizerName>}}; separator="\n">
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <last(grammar.delegators):{g|gParent: Pointer; {<g.recognizerName>}}>
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScopeDeclaration(scope=it)><endif>}>
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@members>
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <! WARNING. bug in ST: this is cut-n-paste into Dbg.stg !>
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: <inputStreamType><grammar.delegators:{g|; const A<g:delegateName()>: IBaseRecognizer{<g.recognizerName>}}>); overload;
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: <inputStreamType>; const AState: IRecognizerSharedState<grammar.delegators:{g|; const A<g:delegateName()>: IBaseRecognizer{<g.recognizerName>}}>); overload;
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IBaseRecognizer }
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenNames: TStringArray; override;
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetGrammarFileName: String; override;
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <actions.(actionScope).memberDeclarations>
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <rules: {r | <genericParserRuleDeclaration(rule=r, ruleDescriptor=r.ruleDescriptor)>}>
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! generate rule/method definitions for imported rules so they
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   appear to be defined in this recognizer. !>
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Delegated rules
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <grammar.delegatedRules:{ruleDescriptor| <delegatedRuleDeclaration(ruleDescriptor)>}>
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <synpreds:{p | <synpredDeclaration(p)>}; separator="\n">
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <cyclicDFAs:cyclicDFADeclaration()>
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FException: ERecognitionException;
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLA: array [0..<grammar.numberOfDecisions>, 0..255] of Integer;
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FCnt: array [0..<grammar.numberOfDecisions>] of Byte;
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InitializeCyclicDFAs;
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(bitsets)>
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class var
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <bitsets:bitsetDecl(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>})>
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class procedure InitializeBitsets; static;<\n>
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimplementation
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruses
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <grammar.delegates: {g|<g.recognizerName>,}; separator="\n">
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <grammar.delegators: {g|<g.recognizerName>,}; separator="\n">
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <actions.(actionScope).usesImplementation>
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SysUtils,
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StrUtils,
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Math;
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ T<grammar.recognizerName> }
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor T<grammar.recognizerName>.Create(const AInput: <inputStreamType><grammar.delegators:{g|; const A<g:delegateName()>: IBaseRecognizer{<g.recognizerName>}}>);
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(AInput, TRecognizerSharedState.Create<grammar.delegators:{g|, A<g:delegateName()>}>);
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor T<grammar.recognizerName>.Create(const AInput: <inputStreamType>;
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AState: IRecognizerSharedState<grammar.delegators:{g|; const A<g:delegateName()>: IBaseRecognizer{<g.recognizerName>}}>);
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AInput, AState);
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@membersConstructor>
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@end>
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <parserCtorBody()>
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <grammar.directDelegates:{g|<g:delegateName()> := T<g.recognizerName>.Create(Input, State<trunc(g.delegators):{p|, <p:delegateName()>}>, Self);}; separator="\n">
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <grammar.indirectDelegates:{g | <g:delegateName()> := <g.delegator:delegateName()>.<g:delegateName()>;}; separator="\n">
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <last(grammar.delegators):{g|gParent := Pointer(A<g:delegateName()>);}>
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <rules: {r | <ruleAttributeScopeInit(scope=r.ruleDescriptor.ruleScope)>}>
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <actions.(actionScope).memberInitializations>
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).memberImplementations>
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<grammar.delegatedRules:{ruleDescriptor| <delegatedRuleImplementation(ruleDescriptor)>}; separator="\n">
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure T<grammar.recognizerName>.InitializeCyclicDFAs;
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <cyclicDFAs:{dfa | FDFA<dfa.decisionNumber> := TDFA<dfa.decisionNumber>.Create(Self);}; separator="\n">
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <cyclicDFAs:{dfa | <if(dfa.specialStateSTs)>FDFA<dfa.decisionNumber>.SpecialStateTransitionHandler := DFA<dfa.decisionNumber>_SpecialStateTransition;<endif>}; separator="\n">
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(bitsets)>
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass procedure T<grammar.recognizerName>.InitializeBitsets;
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <bitsets:bitset(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>}, words64=it.bits)>
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@membersImplementation>
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@end>
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.GetTokenNames: TStringArray;
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(Result,Length(T<grammar.composite.rootGrammar.recognizerName>.TOKEN_NAMES));
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to Length(T<grammar.composite.rootGrammar.recognizerName>.TOKEN_NAMES) - 1 do
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result[I] := T<grammar.composite.rootGrammar.recognizerName>.TOKEN_NAMES[I];
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.GetGrammarFileName: String;
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := '<fileName>';
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules; separator="\n\n">
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpreds:{p | <synpred(p)>}>
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(bitsets)>
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinitialization
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T<grammar.recognizerName>.InitializeBitsets;<\n>
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend.>>
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
447324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegatedRuleDeclaration(ruleDescriptor) ::= <<
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction <ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>): I<returnType()>;<\n>
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction <ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>): <returnType()>;<\n>
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure <ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>);<\n>
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
459324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegatedRuleImplementation(ruleDescriptor) ::= <<
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.<ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>): I<returnType()>;<\n>
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.<ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>): <returnType()>;<\n>
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure T<grammar.recognizerName>.<ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>);<\n>
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <if(ruleDescriptor.hasReturnValue)>Result :=<endif> T<ruleDescriptor.grammar.recognizerName>(<ruleDescriptor.grammar:delegateName()>.Implementor).<ruleDescriptor.name>(<ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", ">);
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
475324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparserCtorBody() ::= <<
476324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverInitializeCyclicDFAs;
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
479324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverState.RuleMemoCount := <length(grammar.allImportedRules)>+1;<\n> <! index from 1..n !>
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<grammar.delegators: {g|<g:delegateName()> := Pointer(A<g:delegateName()>);}; separator="\n">
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser(grammar, name, scopes, tokens, tokenNames, rules, numRules, bitsets, ASTLabelType, superClass="Parser", labelType="Token", members={<actions.parser.members>}) ::= <<
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="ITokenStream", rewriteElementType="Token", ...)>
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a tree parser; same as parser except the input
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  stream is a different type.
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
492324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertreeParser(grammar, name, scopes, tokens, tokenNames, globalAction, rules, numRules, bitsets, labelType={<ASTLabelType>}, ASTLabelType="object", superClass="TreeParser", members={<actions.treeparser.members>}, filterMode) ::= <<
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="ITreeNodeStream", rewriteElementType="Node", ...)>
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simpler version of a rule template that is specific to the imaginary
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  rules created for syntactic predicates.  As they never have return values
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  nor parameters etc..., just give simplest possible method.  Don't do
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  any of the normal memoization stuff in here either; it's a waste.
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  As predicates cannot be inlined into the invoking rule, they need to
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  be in a rule by themselves.
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
503324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversynpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start "<ruleName>"
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure T<grammar.recognizerName>.<ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope(scope=it)>);
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Alt: array [0..<grammar.numberOfDecisions>] of Integer;
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleLabelDefVars()>
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleLabelDefs()>
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(trace)>
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TraceIn('<ruleName>_fragment', <ruleDescriptor.index>);
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <block>
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    TraceOut('<ruleName>_fragment', <ruleDescriptor.index>);
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <block>
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end "<ruleName>"
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
526324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversynpredDecls(name) ::= <<
527324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverSynPredPointer <name>;<\n>
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversynpred(name) ::= <<
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.<name>: Boolean;
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Start: Integer;
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Success: Boolean;
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State.Backtracking := State.Backtracking + 1;
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@start()>
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Start := Input.Mark;
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <name>_fragment(); // can never throw exception
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  except
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    on RE: ERecognitionException do
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WriteLn('Impossible: ' + RE.ToString);
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Success := not State.Failed;
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Input.Rewind(Start);
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@stop()>
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State.Backtracking := State.Backtracking - 1;
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State.Failed := False;
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Success;
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
555324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerSynpred(name) ::= <<
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpred(name)>
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
559324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerSynpredDeclaration(name) ::= <<
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction <name>: Boolean;
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure <name>_fragment;
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
564324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversynpredDeclaration(name) ::= <<
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction <name>: Boolean;
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure <name>_fragment;
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
569324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleMemoization(name) ::= <<
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ((State.Backtracking > 0) and AlreadyParsedRule(Input, <ruleDescriptor.index>)) then
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Exit(<ruleReturnValue()>);
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to test for failure and return from rule */
577324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercheckRuleBacktrackFailure() ::= <<
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)><\n>if (State.Failed) then Exit(<ruleReturnValue()>);<\n><endif>
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This rule has failed, exit indicating failure during backtrack */
582324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBacktrackFailure() ::= <<
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (State.Backtracking > 0) then
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State.Failed := True;
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Exit(<ruleReturnValue()>);
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<endif>
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
590324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParserRuleDeclaration(rule, ruleDescriptor) ::= <<
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.isSynPred)>
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScopeDeclaration(scope=ruleDescriptor.ruleScope)>
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnScopeDeclaration(scope=ruleDescriptor.returnScope)>
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  function <rule.ruleName>: I<returnType()>;<\n>
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  function <rule.ruleName>: <returnType()>;<\n>
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  procedure <rule.ruleName>;<\n>
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
608324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParserRuleInterface(rule, ruleDescriptor) ::= <<
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.isSynPred)>
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction <rule.ruleName>: I<returnType()>;<\n>
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction <rule.ruleName>: <returnType()>;<\n>
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure <rule.ruleName>;<\n>
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
623324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParserRuleReturnType(rule, ruleDescriptor) ::= <<
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.isSynPred)>
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
627324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverI<returnType()> = interface(I<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope)
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for a rule.  This includes any return type
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  data aggregates required for multiple return values.
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,finally,memoize) ::= <<
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScope(scope=ruleDescriptor.ruleScope)>
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnScope(scope=ruleDescriptor.returnScope)>
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start "<ruleName>"
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(* <fileName>:<description> *)
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.<ruleName>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>): I<returnType()>;
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.<ruleName>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>): <returnType()>;
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure T<grammar.recognizerName>.<ruleName>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>);
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.actions.vars>
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Locals: TLocalStorage;
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RetVal: I<returnType()>;<\n>
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RetVal: <returnType()>;<\n>
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Alt: array [0..<grammar.numberOfDecisions>] of Integer;
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleDeclarationVars()>
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleLabelDefVars()>
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Locals.Initialize;
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>TraceIn('<ruleName>', <ruleDescriptor.index>);<endif>
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleScopeSetUp()>
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDeclarations()>
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleLabelDefs()>
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.actions.init>
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@preamble()>
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      try
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleMemoization(name=ruleName)>
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <block>
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleCleanUp()>
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <(ruleDescriptor.actions.after):execAction()>
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(exceptions)>
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!emptyRule)>
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).rulecatch)>
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <actions.(actionScope).rulecatch>
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      except
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        on RE: ERecognitionException do
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        begin
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ReportError(RE);
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Recover(Input,RE);
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          <@setErrorReturnValue()>
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end;<\n>
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    finally
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <if(trace)>TraceOut("<ruleName>", <ruleDescriptor.index>);<endif>
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <memoize()>
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <ruleScopeCleanUp()>
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <finally>
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postamble()>
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Locals.Finalize;
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Exit(<ruleReturnValue()>);
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end "<ruleName>"
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch(decl,action) ::= <<
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch (<e.decl>)
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <e.action>
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
721324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarations() ::= <<
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
723324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRetVal := T<returnType()>.Create;
724324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRetVal.Start := Input.LT(1);<\n>
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a |
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<a.name> := <if(a.initValue)><a.initValue><else><initValue(a.type)><endif>;
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}>
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.name>_StartIndex := Input.Index();
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
735324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarationVars() ::= <<
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a |
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<a.name>: <a.type>;
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}>
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.name>_StartIndex: Integer;
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
747324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeSetUp() ::= <<
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{<it>Stack.Push(T<it>Scope.Create);}; separator="\n">
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{<it.name>Stack.Push(T<it.name>Scope.Create);}; separator="\n">
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
752324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeCleanUp() ::= <<
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{<it>Stack.Pop();}; separator="\n">
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{<it.name>Stack.Pop;}; separator="\n">
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
757324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefs() ::= <<
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels]:{<it.label.text> := nil;}; separator="\n">
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]:{list_<it.label.text> := nil;}; separator="\n">
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleLabels:ruleLabelDef(label=it); separator="\n">
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleListLabels:{ll|<ll.label.text> := nil;}; separator="\n">
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
764324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefVars() ::= <<
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels]:{<it.label.text>: I<labelType>;}; separator="\n">
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]:{list_<it.label.text>: IList\<IANTLRInterface\>;}; separator="\n">
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleLabels:ruleLabelDefVar(label=it); separator="\n">
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleListLabels:{ll|<ll.label.text>: <ruleLabelType(referencedRule=ll.referencedRule)>;}; separator="\n">
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
771324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelDefs() ::= <<
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.tokenListLabels,
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleLabels]
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{<it.label.text> := nil;}; separator="\n"
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.charLabels:{int <it.label.text>;}; separator="\n">
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels,
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels]
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{List_<it.label.text> := nil;}; separator="\n"
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
785324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelDefDeclarations() ::= <<
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.tokenListLabels,
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleLabels]
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{<it.label.text>: I<labelType>;}; separator="\n"
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.charLabels:{int <it.label.text>;}; separator="\n">
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels,
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels]
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{List_<it.label.text>: IList;}; separator="\n"
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
799324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleReturnValue() ::= <<
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasReturnValue)>
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnName>
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
805324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRetVal
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! nil !>
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
813324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= <<
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!TREE_PARSER)>
816324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRetVal.Stop := Input.LT(-1);
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermemoize() ::= <<
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (State.Backtracking > 0) then
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Memoize(Input, <ruleDescriptor.index>, <ruleDescriptor.name>_StartIndex);
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a rule in the lexer; naked blocks are used for
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  fragment rules.
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
833324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start "<ruleName>"
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.parameterScope>
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure T<grammar.recognizerName>.m<ruleName>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>);
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleDescriptor.actions.vars>
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Locals: TLocalStorage;
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenType, Channel: Integer;
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Alt: array [0..<grammar.numberOfDecisions>] of Integer;
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <lexerRuleLabelDefDeclarations()>
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Locals.Initialize;
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleAttributeScope(scope=ruleDescriptor.ruleScope)>
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>TraceIn("<ruleName>", <ruleDescriptor.index>);<endif>
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleScopeSetUp()>
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDeclarations()>
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nakedBlock)>
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <ruleMemoization(name=ruleName)>
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <lexerRuleLabelDefs()>
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <ruleDescriptor.actions.init>
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <block><\n>
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TokenType := <ruleName>;
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Channel := DEFAULT_TOKEN_CHANNEL;
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <ruleMemoization(name=ruleName)>
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <lexerRuleLabelDefs()>
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <ruleDescriptor.actions.init>
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <block>
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <ruleCleanUp()>
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      State.TokenType := TokenType;
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      State.Channel := Channel;
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <(ruleDescriptor.actions.after):execAction()>
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    finally
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <if(trace)>TraceOut("<ruleName>", <ruleDescriptor.index>);<endif>
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <ruleScopeCleanUp()>
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <memoize()>
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Locals.Finalize;
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end "<ruleName>"
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for the implicitly-defined lexer grammar rule
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  that chooses between lexer rules.
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
883324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure T<grammar.recognizerName>.mTokens;
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Alt: array [0..<grammar.numberOfDecisions>] of Integer;
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <block>
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure T<grammar.recognizerName>.DoTokens;
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  mTokens;
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// S U B R U L E S
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (...) subrule with multiple alternatives */
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverblock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(* <fileName>:<description> *)
902324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAlt[<decisionNumber>] := <maxAlt>;
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@predecision()>
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decision>
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postdecision()>
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prebranch()>
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase Alt[<decisionNumber>] of
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <alts:altSwitchCase()>
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postbranch()>
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A rule block with multiple alternatives */
915324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(* <fileName>:<description> *)
917324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAlt[<decisionNumber>] := <maxAlt>;
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@predecision()>
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decision>
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postdecision()>
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase Alt[<decisionNumber>] of
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <alts:altSwitchCase()>
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
927324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(* <fileName>:<description> *)
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A special case of a (...) subrule with a single alternative */
936324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverblockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(* <fileName>:<description> *)
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)+ block with 1 or more alternatives */
945324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(* <fileName>:<description> *)
947324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverFCnt[<decisionNumber>] := 0;
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwhile (True) do
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Alt[<decisionNumber>] := <maxAlt>;
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@predecision()>
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <decision>
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@postdecision()>
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  case Alt[<decisionNumber>] of
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <alts:altSwitchCase()>
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (FCnt[<decisionNumber>] >= 1) then
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Break;
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <ruleBacktrackFailure()>
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      raise EEarlyExitException.Create(<decisionNumber>, Input);
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <@earlyExitException()>
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Inc(FCnt[<decisionNumber>]);
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
972324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlockSingleAlt ::= positiveClosureBlock
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)* block with 1 or more alternatives */
975324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(* <fileName>:<description> *)
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwhile (True) do
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Alt[<decisionNumber>] := <maxAlt>;
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@predecision()>
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <decision>
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@postdecision()>
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  case Alt[<decisionNumber>] of
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <alts:altSwitchCase()>
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Break;
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
994324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlockSingleAlt ::= closureBlock
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Optional blocks (x)? are translated to (x|) by before code generation
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  so we can just use the normal block template
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
999324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlock ::= block
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlockSingleAlt ::= block
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A case in a switch that jumps to an alternative given the alternative
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  number.  A DFA predicts the alternative and then a simple switch
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  does the jump to the code that actually matches that alternative.
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraltSwitchCase() ::= <<
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<i>:
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@prealt()>
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <it><\n>
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An alternative is just a list of elements; at outermost level */
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(* <fileName>:<description> *)
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@declarations()>
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <elements:element()>
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <rew>
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@cleanup()>
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** What to emit when there is no rewrite.  For auto build
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  mode, does nothing.
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernoRewrite(rewriteBlockLevel, treeLevel) ::= ""
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// E L E M E N T S
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dump the elements one per line */
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelement() ::= <<
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prematch()>
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<it.el>
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a token optionally with a label in front */
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex,terminalOptions) ::= <<
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label> := <endif>Match(Input, <token>, FOLLOW_<token>_in_<ruleName><elementIndex>)<if(label)> as I<labelType><endif>;<\n><checkRuleBacktrackFailure()>
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID */
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)>
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabel(label,elem) ::= <<
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (list_<label> = nil) then list_<label> := TList\<IANTLRInterface\>.Create;
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlist_<label>.Add(<elem>);<\n>
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character */
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRef(char,label) ::= <<
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> := Input.LA(1);<\n>
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(<char>); <checkRuleBacktrackFailure()>
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character range */
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRangeRef(a,b,label) ::= <<
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> := Input.LA(1);<\n>
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatchRange(<a>, <b>); <checkRuleBacktrackFailure()>
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** For now, sets are interval tests and must be tested inline */
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,elementIndex,postmatchCode="") ::= <<
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> := Input.LA(1);<\n>
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> := Input.LT(1) as I<labelType>;<\n>
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (<s>) then
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Input.Consume;
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <postmatchCode>
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <if(!LEXER)>
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State.ErrorRecovery := False;<endif>
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <if(backtracking)>State.Failed := False;<endif>
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleBacktrackFailure()>
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FException := EMismatchedSetException.Create(nil, Input);
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@mismatchedSetException()>
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Recover(FException);
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise FException;<\n>
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise FException;
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <! use following code to make it recover inline; remove throw mse;
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RecoverFromMismatchedSet(input,mse,FOLLOW_set_in_<ruleName><elementIndex>);
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  !>
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchRuleBlockSet ::= matchSet
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)>
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a string literal */
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerStringRef(string,label,elementIndex) ::= <<
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverLocals.AsInteger['<label>Start'] := CharIndex;
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(<string>); <checkRuleBacktrackFailure()>
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> := TCommonToken.Create(Input, TToken.INVALID_TOKEN_TYPE, TToken.DEFAULT_CHANNEL, Locals.AsInteger['<label>Start'], CharIndex-1);
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(<string>); <checkRuleBacktrackFailure()>
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(label,elementIndex) ::= <<
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> := Input.LT(1) as I<labelType>;<\n>
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatchAny(input); <checkRuleBacktrackFailure()>
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardAndListLabel(label,elementIndex) ::= <<
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcard(...)>
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match . wildcard in lexer */
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardChar(label, elementIndex) ::= <<
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> := Input.LA(1);<\n>
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatchAny(); <checkRuleBacktrackFailure()>
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardCharListLabel(label, elementIndex) ::= <<
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcardChar(...)>
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a rule reference by invoking it possibly with arguments
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and a return value or values.  The 'rule' argument was the
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  target rule name, but now is type Rule, whose toString is
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  same: the rule name.  Now though you can access full rule
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  descriptor stuff.
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args,scope) ::= <<
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverPushFollow(FOLLOW_<rule.name>_in_<ruleName><elementIndex>);
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> := <if(scope)><scope:delegateName()>.<endif><rule.name>(<args; separator=", ">);<\n>
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope)>T<scope.recognizerName>(IANTLRObject(<scope:delegateName()>).Implementor).<endif><rule.name>(<args; separator=", ">);<\n>
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverState.FollowingStackPointer := State.FollowingStackPointer - 1;
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=r */
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)>
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A lexer rule reference.
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The 'rule' argument was the target rule name, but now
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is type Rule, whose toString is same: the rule name.
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Now though you can access full rule descriptor stuff.
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRef(rule,label,args,elementIndex,scope) ::= <<
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverLocals.AsInteger['<label>Start<elementIndex>'] := CharIndex;
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope)><scope:delegateName()>.<endif>m<rule.name>(<args; separator=", ">); <checkRuleBacktrackFailure()>
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> := TCommonToken.Create(Input, TToken.INVALID_TOKEN_TYPE, TToken.DEFAULT_CHANNEL,
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Locals.AsInteger['<label>Start<elementIndex>'], CharIndex - 1);
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope)>(<scope:delegateName()>.Implementor as T<scope.recognizerName>).<endif>m<rule.name>(<args; separator=", ">); <checkRuleBacktrackFailure()>
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** i+=INT in lexer */
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= <<
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<lexerRuleRef(...)>
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** EOF in the lexer */
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerMatchEOF(label,elementIndex) ::= <<
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverLocals.AsInteger['<label>Start<elementIndex>'] := CharIndex;
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(EOF); <checkRuleBacktrackFailure()>
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverLocals['<label>'] := TCommonToken.Create(Input, EOF, TToken.DEFAULT_CHANNEL, Locals.AsInteger['<label>Start<elementIndex>'], CharIndex-1);
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(EOF); <checkRuleBacktrackFailure()>
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match ^(root children) in tree parser */
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree(root, actionsAfterRoot, children, nullableChildList,
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     enclosingTreeLevel, treeLevel) ::= <<
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<root:element()>
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actionsAfterRoot:element()>
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nullableChildList)>
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (Input.LA(1) = TToken.DOWN) then
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Match(Input, TToken.DOWN, nil); <checkRuleBacktrackFailure()>
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <children:element()>
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Match(Input, TToken.UP, nil); <checkRuleBacktrackFailure()>
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(Input, TToken.DOWN, nil); <checkRuleBacktrackFailure()>
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<children:element()>
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(Input, TToken.UP, nil);<\n><checkRuleBacktrackFailure()>
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Every predicate is used as a validating predicate (even when it is
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  also hoisted into a prediction expression).
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvervalidateSemanticPredicate(pred,description) ::= <<
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (not (<evalPredicate(...)>)) then
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleBacktrackFailure()>
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise EFailedPredicateException.Create(Input, '<ruleName>', '<description>');
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (if-then-else)
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverFLA[<decisionNumber>,<stateNumber>] := Input.LA(<k>);<\n>
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Alt[<decisionNumber>] := <eotPredictsAlt>;<\n>
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleBacktrackFailure()>
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise ENoViableAltException.Create('<description>', <decisionNumber>, <stateNumber>, Input);<\n>
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Same as a normal DFA state except that we don't examine lookahead
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for the bypass alternative.  It delays error detection but this
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is faster, smaller, and more what people expect.  For (X)? people
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  expect "if ( LA(1)==X ) match(X);" and that's it.
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverFLA[<decisionNumber>,<stateNumber>] := Input.LA(<k>);<\n>
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">;
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state that is actually the loopback decision of a closure
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  loop.  If end-of-token (EOT) predicts any of the targets then it
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  should act like a default clause (i.e., no error can be generated).
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This is used only in the lexer so that for ('a')* on the end of a rule
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  anything other than 'a' predicts exiting.
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverFLA[<decisionNumber>,<stateNumber>] := Input.LA(<k>);
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">;<\n>
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!edges)>
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAlt[<decisionNumber>] := <eotPredictsAlt>; <! if no edges, don't gen ELSE !>
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Alt[<decisionNumber>] := <eotPredictsAlt>;
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An accept state indicates a unique alternative has been predicted */
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaAcceptState(alt) ::= "Alt[<decisionNumber>] := <alt>;"
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simple edge with an expression.  If the expression is satisfied,
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  enter to the target state.  To handle gated productions, we may
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  have to evaluate some predicates for this edge.
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdge(labelExpr, targetState, predicates) ::= <<
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ((<labelExpr>)<if(predicates)> and (<predicates>)<endif>) then
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <targetState>
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend <! no ; here !>
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (switch case)
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state where a SWITCH may be generated.  The code generator
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  decides if this is possible: CodeGenerator.canGenerateSwitch().
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase Input.LA(<k>) of
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <edges; separator="\n">
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Alt[<decisionNumber>] := <eotPredictsAlt>;
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@noViableAltException()>
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    raise ENoViableAltException.Create('<description>', <decisionNumber>, <stateNumber>, Input);<\n>
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase Input.LA(<k>) of
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <edges; separator="\n">
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase Input.LA(<k>) of
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <edges; separator="\n"><\n>
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Alt[<decisionNumber>] := <eotPredictsAlt>;<\n>
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdgeSwitch(labels, targetState) ::= <<
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<labels:{<it>}; separator=",\n">:
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <targetState>
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// C y c l i c  D F A
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The code to initiate execution of a cyclic DFA; this is used
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in the rule to predict an alt just like the fixed DFA case.
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The <name> attribute is inherited via the parser, lexer, ...
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaDecision(decisionNumber,description) ::= <<
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAlt[<decisionNumber>] := FDFA<decisionNumber>.Predict(Input);
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Dump DFA tables.
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFADeclaration(dfa) ::= <<
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstrict protected
1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  type
1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    TDFA<dfa.decisionNumber> = class(TDFA)
1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected
1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      { IDFA }
1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      function Description: String; override;
1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public
1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      constructor Create(const ARecognizer: IBaseRecognizer);
1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  var
1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FDFA<dfa.decisionNumber>: IDFA;
1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)>
1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstrict protected
1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  function DFA<dfa.decisionNumber>_SpecialStateTransition(const DFA: IDFA; S: Integer;
1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const AInput: IIntStream): Integer;<endif>
1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1368324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFA(dfa) ::= <<
1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ T<grammar.recognizerName>.TDFA<dfa.decisionNumber> }
1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor T<grammar.recognizerName>.TDFA<dfa.decisionNumber>.Create(const ARecognizer: IBaseRecognizer);
1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DFA<dfa.decisionNumber>_EOT = '<dfa.javaCompressedEOT; wrap="'+\n    '">';
1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DFA<dfa.decisionNumber>_EOF = '<dfa.javaCompressedEOF; wrap="'+\n    '">';
1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DFA<dfa.decisionNumber>_MIN = '<dfa.javaCompressedMin; wrap="'+\n    '">';
1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DFA<dfa.decisionNumber>_MAX = '<dfa.javaCompressedMax; wrap="'+\n    '">';
1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DFA<dfa.decisionNumber>_ACCEPT = '<dfa.javaCompressedAccept; wrap="'+\n    '">';
1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DFA<dfa.decisionNumber>_SPECIAL = '<dfa.javaCompressedSpecial; wrap="'+\n    '">';
1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DFA<dfa.decisionNumber>_TRANSITION: array [0..<length(dfa.javaCompressedTransition)>-1] of String = (
1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <dfa.javaCompressedTransition:{s|'<s; wrap="'+\n'">'}; separator=",\n">);
1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Recognizer := ARecognizer;
1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DecisionNumber := <dfa.decisionNumber>;
1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EOT := TDFA.UnpackEncodedString(DFA<dfa.decisionNumber>_EOT);
1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EOF := TDFA.UnpackEncodedString(DFA<dfa.decisionNumber>_EOF);
1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Min := TDFA.UnpackEncodedStringToUnsignedChars(DFA<dfa.decisionNumber>_MIN);
1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Max := TDFA.UnpackEncodedStringToUnsignedChars(DFA<dfa.decisionNumber>_MAX);
1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Accept := TDFA.UnpackEncodedString(DFA<dfa.decisionNumber>_ACCEPT);
1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Special := TDFA.UnpackEncodedString(DFA<dfa.decisionNumber>_SPECIAL);
1391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Transition := TDFA.UnpackEncodedStringArray(DFA<dfa.decisionNumber>_TRANSITION);
1392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.TDFA<dfa.decisionNumber>.Description: String;
1395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := '<dfa.description>';
1397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
1398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)>
1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction T<grammar.recognizerName>.DFA<dfa.decisionNumber>_SpecialStateTransition(const DFA: IDFA; S: Integer;
1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AInput: IIntStream): Integer;
1401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Locals: TLocalStorage;
1403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <if(LEXER)>
1404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Input: IIntStream;
1405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <endif>
1406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <if(PARSER)>
1407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Input: ITokenStream;
1408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <endif>
1409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <if(TREE_PARSER)>
1410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Input: ITreeNodeStream;
1411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <endif>
1412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  _S: Integer;
1413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NVAE: ENoViableAltException;
1414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := -1;
1416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Locals.Initialize;
1417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
1418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(LEXER)>
1419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Input := AInput;
1420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <endif>
1421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(PARSER)>
1422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Input := AInput as ITokenStream;
1423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <endif>
1424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(TREE_PARSER)>
1425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Input := AInput as ITreeNodeStream;
1426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <endif>
1427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    _S := S;
1428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    case S of
1429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <dfa.specialStateSTs:{state | <i0>: begin<! compressed special state numbers 0..n-1 !>
1430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     <state> <\n>   end;}; separator="\n">
1431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
1432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (State.Backtracking > 0) then
1434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
1435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      State.Failed := True;
1436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Exit(-1);
1437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;<\n>
1438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NVAE := ENoViableAltException.Create(DFA.Description, <dfa.decisionNumber>, _S, Input);
1440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    DFA.Error(NVAE);
1441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    raise NVAE;
1442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
1443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Locals.Finalize;
1444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
1446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A state in a cyclic DFA; it's a special state and part of a big switch on
1450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state.
1451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1452324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
1453324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverFLA[<decisionNumber>,<stateNumber>] := Input.LA(1);<\n>
1454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(semPredState)> <! get next lookahead symbol to test edges, then rewind !>
1455324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverLocals.AsInteger['index<decisionNumber>_<stateNumber>'] := Input.Index;
1456324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverInput.Rewind;<\n>
1457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1458324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverS := -1;
1459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">;
1460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(semPredState)> <! return input cursor to state before we rewound !>
1461324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverInput.Seek(Locals.AsInteger['index<decisionNumber>_<stateNumber>']);<\n>
1462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (S >= 0) then
1464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Exit(S);
1465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Just like a fixed DFA edge, test the lookahead and indicate what
1468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state to jump to next if successful.
1469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1470324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
1471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ((<labelExpr>)<if(predicates)> and (<predicates>)<endif>) then
1472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := <targetStateNumber>
1473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An edge pointing at end-of-token; essentially matches any char;
1476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  always jump to the target.
1477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1478324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvereotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= <<
1479324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverS := <targetStateNumber>;<\n>
1480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// D F A  E X P R E S S I O N S
1484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1485324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverandPredicates(left,right) ::= "((<left>) and (<right>))"
1486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1487324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverorPredicates(operands) ::= "((<first(operands)>)<rest(operands):{o | or (<o>)}>)"
1488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1489324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernotPredicate(pred) ::= "!(<evalPredicate(...)>)"
1490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1491324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalPredicate(pred,description) ::= "(<pred>)"
1492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1493324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalSynPredicate(pred,description) ::= "<pred>()"
1494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1495324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadTest(atom,k,atomAsInt) ::= "FLA[<decisionNumber>,<stateNumber>] = <atomAsInt>"
1496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
1498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  somewhere.  Must ask for the lookahead directly.
1499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1500324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadTest(atom,k,atomAsInt) ::= "Input.LA(<k>) = <atomAsInt>"
1501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1502324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <<
1503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((FLA[<decisionNumber>,<stateNumber>] \>= <lowerAsInt>) and (FLA[<decisionNumber>,<stateNumber>] \<= <upperAsInt>))
1504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1506324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(Input.LA(<k>) \>= <lowerAsInt>) and (Input.LA(<k>) \<= <upperAsInt>)"
1507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1508324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTest(ranges) ::= "<ranges; separator=\") or (\">"
1509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// A T T R I B U T E S
1511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1512324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScope(scope) ::= <<
1513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.name>Stack := TStackList\<I<scope.name>Scope\>.Create;<\n>
1514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1517324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeDeclaration(scope) ::= <<
1518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstrict protected
1520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  type
1521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    I<scope.name>Scope = interface(IANTLRObject)
1522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
1523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    T<scope.name>Scope = class(TANTLRObject, I<scope.name>Scope)
1524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected
1525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <scope.attributes:{<it.name>: <it.type>;}; separator="\n">
1526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
1527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstrict protected
1528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <scope.name>Stack: IStackList\<I<scope.name>Scope\>;
1529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1532324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeDeclaration(scope) ::= <<
1533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstrict protected
1535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  type
1536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    I<scope.name>Scope = interface(IANTLRObject)
1537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
1538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    T<scope.name>Scope = class(TANTLRObject, I<scope.name>Scope)
1539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected
1540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <scope.attributes:{<it.name>: <it.type>;}; separator="\n">
1541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
1542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstrict protected
1543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <scope.name>Stack: IStackList\<I<scope.name>Scope\>;
1544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1547324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScope(scope) ::= <<
1548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! protected Stack <scope.name>Stack = new Stack();<\n> !>
1549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1551324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeInit(scope) ::= <<
1552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope)>
1553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.name>Stack := TStackList\<I<scope.name>Scope\>.Create;<\n>
1554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1557324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnStructName() ::= "<it.name>_return"
1558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1559324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnType() ::= <<
1560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor:returnStructName()>
1562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! I<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope !>
1563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
1565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnType>
1566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! Pointer/void !>
1568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Generate the C# type associated with a single or multiple return
1573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  values.
1574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1575324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelType(referencedRule) ::= <<
1576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
1577324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverI<referencedRule.name>_return
1578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasSingleReturnValue)>
1580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRule.singleValueReturnType>
1581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
1583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1587324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateName() ::= <<
1588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(it.label)><it.label><else>g<it.name><endif>
1589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Using a type to init value map, try to init a type; if not in table
1592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  must be an object, default value is "null".
1593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1594324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinitValue(typeName) ::= <<
1595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<csharpTypeInitMap.(typeName)>
1596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a rule label including default value */
1599324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDef(label) ::= <<
1600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label.label.text> := <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;<\n>
1601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1603324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefVar(label) ::= <<
1604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label.label.text>: <ruleLabelType(referencedRule=label.referencedRule)>;
1605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a return struct for a rule if the code needs to access its
1608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  start/stop tokens, tree stuff, attributes, ...  Leave a hole for
1609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  subgroups to stick in members.
1610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1611324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScope(scope) ::= <<
1612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ T<ruleDescriptor:returnStructName()> }
1614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{public <it.decl>;}; separator="\n">
1616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@ruleReturnMembers()>
1617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1620324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScopeDeclaration(scope) ::= <<
1621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic
1623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  type
1624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    T<ruleDescriptor:returnStructName()> = class(T<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope, I<ruleDescriptor:returnStructName()>)
1625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scope.attributes:{public <it.decl>;}; separator="\n">
1626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@ruleReturnMembers()>
1627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
1628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1631324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterScope(scope) ::= <<
1632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{<it.decl>}; separator=", ">
1633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1635324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterAttributeRef(attr) ::= "<attr.name>"
1636324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterSetAttributeRef(attr,expr) ::= "<attr.name> := <expr>;"
1637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1638324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeAttributeRef(scope,attr,index,negIndex) ::= <<
1639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>Stack[<scope>Stack.Count-<negIndex>-1] as T<scope>Scope).<attr.name>
1641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>Stack[<index>] as T<scope>Scope).<attr.name>
1644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_scope)<scope>_stack[<index>]).<attr.name>
1645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>Stack.Peek.Implementor as T<scope>Scope).<attr.name>
1647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1651324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeSetAttributeRef(scope,attr,expr,index,negIndex) ::= <<
1652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>Stack[<scope>Stack.Count-<negIndex>-1] as T<scope>Scope).<attr.name> := <expr>;<\n>
1654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>Stack[<index>] as T<scope>Scope).<attr.name> := <expr>;<\n>
1657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>Stack.Peek.Implementor as T<scope>Scope).<attr.name> := <expr>;<\n>
1659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $x is either global scope or x is rule with dynamic scope; refers
1664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  to stack itself not top of stack.  This is useful for predicates
1665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  like {$function.size()>0 && $function::name.equals("foo")}?
1666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1667324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedDynamicScopeRef(scope) ::= "<scope>Stack"
1668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** reference an attribute of rule; might only have single return value */
1670324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelRef(referencedRule,scope,attr) ::= <<
1671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
1672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(IfThen(Assigned(<scope>),Def(<scope>).<attr.name>,<initValue(attr.type)>))
1673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>
1675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1678324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnAttributeRef(ruleDescriptor,attr) ::= <<
1679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1680324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRetVal.<attr.name>
1681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name>
1683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1686324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnSetAttributeRef(ruleDescriptor,attr,expr) ::= <<
1687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1688324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRetVal.<attr.name> := <expr>;
1689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name> := <expr>;
1691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to translate $tokenLabel */
1695324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelRef(label) ::= "<label>"
1696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID {$ids} or e+=expr {$e} */
1698324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelRef(label) ::= "list_<label>"
1699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// not sure the next are the right approach
1702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1703324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_text(scope,attr) ::= "(Def(<scope>).Text)"
1704324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_type(scope,attr) ::= "(Def(<scope>).TokenType)"
1705324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_line(scope,attr) ::= "(Def(<scope>).Line)"
1706324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_pos(scope,attr) ::= "(Def(<scope>).CharPositionInLine)"
1707324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_channel(scope,attr) ::= "(Def(<scope>).Channel)"
1708324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_index(scope,attr) ::= "(Def(<scope>).TokenIndex)"
1709324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_tree(scope,attr) ::= "<scope>_tree"
1710324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_int(scope,attr) ::= "(StrToIntDef(Def(<scope>).Text,0))"
1711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1712324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_start(scope,attr) ::= "(IfThen(Assigned(<scope>), Def(<scope>).Start, nil) as I<labelType>)"
1713324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_stop(scope,attr) ::= "(Def(<scope>).Stop as I<labelType>)"
1714324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_tree(scope,attr) ::= "(Def(Def(<scope>).Tree as I<ASTLabelType>))"
1715324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_text(scope,attr) ::= <<
1716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
1717324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIfThen(Assigned(<scope>), Input.TokenStream.ToString(
1718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Input.TreeAdaptor.GetTokenStartIndex(Def(<scope>).Start),
1719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Input.TreeAdaptor.GetTokenStopIndex(Def(<scope>).Start)), '')
1720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1721324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIfThen(Assigned(<scope>), Input.ToString(
1722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  (Def(<scope>).Start) as IToken,(Def(<scope>).Stop) as IToken), '')
1723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1725324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_st(scope,attr) ::= "((<scope> != null) ? <scope>.ST : null)"
1726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Isolated $RULE ref ok in lexer as it's a Token */
1728324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabel(label) ::= "<label>"
1729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1730324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_type(scope,attr) ::= "(Def(<scope>).TokenType)"
1731324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_line(scope,attr) ::= "(Def(<scope>).Line)"
1732324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_pos(scope,attr) ::= "(IfThen(Assigned(<scope>),Def(<scope>).CharPositionInLine,-1))"
1733324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_channel(scope,attr) ::= "(Def(<scope>).Channel)"
1734324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_index(scope,attr) ::= "(Def(<scope>).TokenIndex)"
1735324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_text(scope,attr) ::= "(Def(<scope>).Text)"
1736324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_int(scope,attr) ::= "(StrToIntDef(Def(<scope>).Text,0))"
1737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Somebody may ref $template or $tree or $stop within a rule:
1739324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_start(scope,attr) ::= "(RetVal.Start as I<labelType>)"
1740324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_stop(scope,attr) ::= "(RetVal.Stop as I<labelType>)"
1741324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_tree(scope,attr) ::= "(RetVal.Tree as I<ASTLabelType>)"
1742324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_text(scope,attr) ::= <<
1743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
1744324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverInput.TokenStream.ToString(
1745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Input.TreeAdaptor.GetTokenStartIndex(RetVal.Start),
1746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Input.TreeAdaptor.GetTokenStopIndex(RetVal.Start))
1747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1748324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverInput.ToString(RetVal.Start as IToken,Input.LT(-1))
1749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1751324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_st(scope,attr) ::= "RetVal.ST"
1752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1753324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_text(scope,attr) ::= "Text"
1754324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_type(scope,attr) ::= "TokenType"
1755324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_line(scope,attr) ::= "State.TokenStartLine"
1756324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_pos(scope,attr) ::= "State.TokenStartCharPositionInLine"
1757324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_index(scope,attr) ::= "-1" // undefined token index in lexer
1758324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_channel(scope,attr) ::= "Channel"
1759324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_start(scope,attr) ::= "State.TokenStartCharIndex"
1760324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_stop(scope,attr) ::= "(CharIndex-1)"
1761324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_int(scope,attr) ::= "StrToInt(<scope>.Text)"
1762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// setting $st and $tree is allowed in local rule. everything else
1764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// is flagged as error
1765324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_tree(scope,attr,expr) ::= "RetVal.Tree := <expr>;"
1766324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_st(scope,attr,expr) ::= "RetVal.ST := <expr>;"
1767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to execute an action (only when not backtracking) */
1770324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecAction(action) ::= <<
1771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).synpredgate)>
1773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (<actions.(actionScope).synpredgate>) then
1774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <action>
1776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (State.Backtracking = 0) then
1779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <action>
1781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;<\n>
1782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<action>
1785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to always execute an action even when backtracking */
1790324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecForcedAction(action) ::= "<action>"
1791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// M I S C (properties, etc...)
1793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbitset(name, words64) ::= <<
1795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name> := TBitSet.Create([<words64:{<it>};separator=",">]);<\n>
1796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1798324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbitsetDecl(name) ::= <<
1799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>: IBitSet;<\n>
1800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1802324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercodeFileExtension() ::= ".pas"
1803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertrue() ::= "True"
1805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfalse() ::= "False"
1806