1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/******************************************************************************
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *********************  M A J O R   C O M P O N E N T S  **********************
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ******************************************************************************/
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// System.Boolean.ToString() returns "True" and "False", but the proper C# literals are "true" and "false"
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// The Java version of Boolean returns "true" and "false", so they map to themselves here.
7324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbooleanLiteral ::= [
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"True":"true",
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"False":"false",
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"true":"true",
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"false":"false",
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	default:"false"
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver]
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The overall file structure of a recognizer; stores methods
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * for rules and cyclic DFAs plus support code.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
18324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroutputFile(LEXER, PARSER, TREE_PARSER, actionScope, actions, docComment, recognizer, name,
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  tokens, tokenNames, rules, cyclicDFAs, bitsets, buildTemplate, buildAST, rewriteMode,
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  profile, backtracking, synpreds, memoize, numRules, fileName, ANTLRVersion, generatedTimestamp,
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  trace, scopes, superClass, literals) ::=
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/env ruby
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <fileName>
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# --
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Generated using ANTLR version: <ANTLRVersion>
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Ruby runtime library version: <runtimeLibraryVersion()>
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Input grammar file: <fileName>
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Generated at: <generatedTimestamp>
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ~~~\> start load path setup
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthis_directory = File.expand_path( File.dirname( __FILE__ ) )
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$LOAD_PATH.unshift( this_directory ) unless $LOAD_PATH.include?( this_directory )
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr_load_failed = proc do
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  load_path = $LOAD_PATH.map { |dir| '  - ' \<\< dir }.join( $/ )
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise LoadError, \<\<-END.strip!
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverFailed to load the ANTLR3 runtime library (version <runtimeLibraryVersion()>):
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
43324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEnsure the library has been installed on your system and is available
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveron the load path. If rubygems is available on your system, this can
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbe done with the command:
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  gem install antlr3
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCurrent load path:
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#{ load_path }
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefined?( ANTLR3 ) or begin
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # 1: try to load the ruby antlr3 runtime library from the system path
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  require 'antlr3'
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrescue LoadError
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # 2: try to load rubygems if it isn't already loaded
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  defined?( Gem ) or begin
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    require 'rubygems'
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  rescue LoadError
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    antlr_load_failed.call
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # 3: try to activate the antlr3 gem
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Gem.activate( 'antlr3', '~> <runtimeLibraryVersion()>' )
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  rescue Gem::LoadError
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    antlr_load_failed.call
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  require 'antlr3'
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# \<~~~ end load path setup
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<placeAction(scope="all", name="header")>
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<placeAction(scope=actionScope,name="header")>
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.grammarIsRoot)>
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rootGrammarOutputFile()>
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<delegateGrammarOutputFile()>
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<placeAction(scope=actionScope,name="footer")>
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<placeAction(scope="all", name="footer")>
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).main)>
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __FILE__ == $0 and ARGV.first != '--'
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <placeAction(scope=actionScope,name="main")>
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenDataModule() ::= <<
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# TokenData defines all of the token type integer values
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# as constants, which will be included in all
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ANTLR-generated recognizers.
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst_defined?( :TokenData ) or TokenData = ANTLR3::TokenScheme.new
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule TokenData
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(tokens)>
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # define the token constants
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  define_tokens( <tokens:{it | :<it.name> => <it.type>}; anchor, wrap="\n", separator=", "> )
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(tokenNames)>
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # register the proper human-readable name or literal value
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # for each token type
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  #
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # this is necessary because anonymous tokens, which are
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # created from literal values in the grammar, do not
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # have descriptive names
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  register_names( <tokenNames:{it | <it>}; separator=", ", anchor, wrap="\n"> )
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <placeAction(scope="token",name="scheme")>
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <placeAction(scope="token",name="members")>
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend<\n>
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
130324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrootGrammarOutputFile() ::= <<
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule <recognizer.grammar.name>
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <placeAction(scope="module",name="head")>
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <tokenDataModule()>
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <recognizer>
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <placeAction(scope="module",name="foot")>
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
139324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateGrammarOutputFile() ::= <<
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire '<recognizer.grammar.delegator.recognizerName>'
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<delegateGrammarModuleHead(gram=recognizer.grammar.delegator)>
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <recognizer>
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<delegateGrammarModuleTail(gram=recognizer.grammar.delegator)>
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
147324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateGrammarModuleHead(gram) ::= <<
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(gram.grammarIsRoot)>
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule <gram.name>
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<delegateGrammarModuleHead(gram=gram.delegator)><\n>
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass <gram.name>
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
156324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateGrammarModuleTail(gram) ::= <<
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(gram.grammarIsRoot)>
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # module <gram.name>
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # class <gram.name>
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<delegateGrammarModuleTail(gram=gram.delegator)><\n>
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* * * * * * * * * * R E C O G N I Z E R   C L A S S E S * * * * * * * * * */
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser(
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  grammar, name, scopes, tokens, tokenNames, rules, numRules, bitsets,
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ASTLabelType="Object", superClass="ANTLR3::Parser", labelType="ANTLR3::Token",
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  members={<actions.parser.members>}
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver) ::= <<
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)><autoloadDelegates()><endif>
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass <if(grammar.grammarIsRoot)>Parser<else><grammar.name><endif> \< <superClass>
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <parserBody(inputStreamType="ANTLR3::TokenStream", rewriteElementType="Token", actionScope="parser", ...)>
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # class <if(grammar.grammarIsRoot)>Parser<else><grammar.name><endif> \< <superClass>
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!actions.(actionScope).main)>
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverat_exit { <if(grammar.grammarIsRoot)>Parser<else><grammar.name><endif>.main( ARGV ) } if __FILE__ == $0
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a tree parser; same as parser except the
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * input stream is a different type.
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
185324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertreeParser(grammar, name, scopes, tokens, tokenNames, globalAction, rules, numRules, bitsets, filterMode, labelType={<ASTLabelType>}, ASTLabelType="Object", superClass="ANTLR3::TreeParser", members={<actions.treeparser.members>}) ::= <<
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)><autoloadDelegates()><endif>
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass <if(grammar.grammarIsRoot)>TreeParser<else><grammar.name><endif> \< <superClass>
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <parserBody(inputStreamType="TreeNodeStream", rewriteElementType="Node", actionScope="treeparser", ...)>
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # class <if(grammar.grammarIsRoot)>TreeParser<else><grammar.name><endif> \< <superClass>
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!actions.(actionScope).main)>
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverat_exit { <if(grammar.grammarIsRoot)>TreeParser<else><grammar.name><endif>.main( ARGV ) } if __FILE__ == $0
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
197324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparserBody(grammar, name, scopes, tokens, tokenNames, rules, numRules, bitsets, inputStreamType, superClass, filterMode, labelType, members, rewriteElementType, actionScope, ASTLabelType="Object") ::= <<
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@grammar_home = <grammar.name>
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!grammar.grammarIsRoot)><autoloadDelegates()><\n><endif>
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@mixins()>
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
202324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRULE_METHODS = [ <rules:{r|:<r.ruleName>}; separator=", ", wrap="\n", anchor> ].freeze
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeClass()><\n><endif>}>
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{it | <ruleAttributeScopeClass(.ruleDescriptor.ruleScope)>}>
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegators)>
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermasters( <grammar.delegators:{d|:<d.name>}; separator=", "> )<\n>
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)>
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimports( <grammar.directDelegates:{d|:<d.name>}; separator=", "> )<\n>
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinclude TokenData
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  generated_using( "<fileName>", "<ANTLRVersion>", "<runtimeLibraryVersion()>" )
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrescue NoMethodError => error
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # ignore
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!grammar.grammarIsRoot)>
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire '<grammar.composite.rootGrammar.recognizerName>'
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinclude <grammar.composite.rootGrammar.name>::TokenData<\n><\n>
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<parserConstructor()>
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@additionalMembers()>
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<members>
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - - - - - - - - - - - - Rules - - - - - - - - - - - - -
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{it | <it><\n>}>
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegatedRules)>
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - - - - - - - - - - Delegated Rules - - - - - - - - - - -
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<grammar.delegatedRules:{ruleDescriptor|<delegateRule(ruleDescriptor)><\n>}>
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(cyclicDFAs)>
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - - - - - - - - - - DFA definitions - - - - - - - - - - -
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:{it | <cyclicDFA(it)>}>
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef initialize_dfas
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  super rescue nil
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <cyclicDFAs:{it | <cyclicDFAInit(it)>}>
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<bitsets:{it | TOKENS_FOLLOWING_<it.name>_IN_<it.inName>_<it.tokenIndex> = Set[ <it.tokenTypes:{it | <it>}; separator=", "> ]<\n>}>
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
250324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparserConstructor() ::= <<
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef initialize( <grammar.delegators:{g|<g:delegateName()>, }>input, options = {} )
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  super( input, options )
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)><if(grammar.grammarIsRoot)>
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @state.rule_memory = {}
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><endif>
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeStack()><\n><endif>}><rules:{it | <ruleAttributeScopeStack(.ruleDescriptor.ruleScope)>}>
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <placeAction(scope=actionScope,name="init")>
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <grammar.delegators:{g|@<g:delegateName()> = <g:delegateName()><\n>}><grammar.directDelegates:{g|@<g:delegateName()> = <newDelegate(g)><\n>}><last(grammar.delegators):{g|@parent = @<g:delegateName()><\n>}><@init()>
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* * * * * * * * * * * * * R U L E   M E T H O D S * * * * * * * * * * * * */
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simpler version of a rule template that is specific to the
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * imaginary rules created for syntactic predicates.  As they
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * never have return values nor parameters etc..., just give
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * simplest possible method.  Don't do any of the normal
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * memoization stuff in here either; it's a waste. As
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * predicates cannot be inlined into the invoking rule, they
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * need to be in a rule by themselves.
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
273324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversynpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::= <<
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# syntactic predicate <ruleName>
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# (in <fileName>)
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <description>
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# This is an imaginary rule inserted by ANTLR to
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# implement a syntactic predicate decision
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef <ruleName><if(ruleDescriptor.parameterScope)>( <ruleDescriptor.parameterScope:parameterScope()> )<endif>
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <traceIn()><ruleLabelDefs()>
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <block>
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverensure
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <traceOut()>
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for a rule.  This includes any return
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * type data aggregates required for multiple return values.
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrule(ruleName, ruleDescriptor, block, emptyRule, description, exceptions, finally, memoize) ::= <<
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnScope(scope=ruleDescriptor.returnScope)>
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# parser rule <ruleName>
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# (in <fileName>)
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <description>
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef <ruleName><if(ruleDescriptor.parameterScope)>( <ruleDescriptor.parameterScope:parameterScope()> )<endif>
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <traceIn()><ruleScopeSetUp()><ruleDeclarations()><ruleLabelDefs()><action(name="init", code=ruleDescriptor.actions.init)>
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@body><ruleBody()><@end>
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  return <ruleReturnValue()>
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.modifier)>
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.modifier> :<ruleName> rescue nil<\n>
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
316324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateRule(ruleDescriptor) ::= <<
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# delegated rule <ruleDescriptor.name>
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef <ruleDescriptor.name><if(ruleDescriptor.parameterScope)>( <ruleDescriptor.parameterScope:parameterScope()> )<endif>
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <methodCall(del=ruleDescriptor.grammar, n=ruleDescriptor.name, args={<ruleDescriptor.parameterScope.attributes:{it | <it.name>}>})>
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// HELPERS
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
324324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecognizerClassName() ::= <<
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>TreeParser<elseif(PARSER)>Parser<else>Lexer<endif>
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
328324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinitializeDirectDelegate() ::= <<
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@<g:delegateName()> = <g.name>::<recognizerClassName()>.new(
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <trunc(g.delegators):{p|<p:delegateName()>, }>self, input, options.merge( :state => @state )
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver)
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
334324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinitializeDelegator() ::= <<
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@<g:delegateName()> = <g:delegateName()>
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
338324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraltSwitchCase(altNum,alt) ::= <<
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwhen <altNum>
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@prealt()>
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <alt>
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
344324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverblockBody() ::= <<
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@decision><decision><@end>
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase alt_<decisionNumber>
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts:{a | <altSwitchCase(i,a)>}; separator="\n">
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch(decl, action) ::= <<
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - - - - - - @catch <e.decl> - - - - - -
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrescue <e.decl>
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <e.action><\n>
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
357324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlockLoop() ::= <<
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwhile true # decision <decisionNumber>
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  alt_<decisionNumber> = <maxAlt>
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@decisionBody><decision><@end>
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  case alt_<decisionNumber>
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <alts:{a | <altSwitchCase(i,a)>}; separator="\n">
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    break # out of loop for decision <decisionNumber>
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # loop for decision <decisionNumber>
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
369324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateName(d) ::= <<
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(d.label)><d.label; format="label"><else><d.name; format="snakecase"><endif>
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelement(e) ::= <<
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<e.el><\n>
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
377324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecForcedAction(action) ::= "<action>"
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
379324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeClass(scope) ::= <<
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>@@<scope.name> = Scope( <scope.attributes:{it | <it.decl; format="rubyString">}; separator=", "> )<\n><endif>
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
383324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeStack(scope) ::= <<
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>@<scope.name>_stack = []<\n><endif>
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
387324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernoRewrite(rewriteBlockLevel, treeLevel) ::= ""
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
389324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterScope(scope) ::= <<
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{it | <it.decl>}; separator=", ">
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
393324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlockLoop() ::= <<
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch_count_<decisionNumber> = 0
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwhile true
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  alt_<decisionNumber> = <maxAlt>
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@decisionBody><decision><@end>
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  case alt_<decisionNumber>
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <alts:{a | <altSwitchCase(i,a)>}; separator="\n">
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    match_count_<decisionNumber> > 0 and break
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    eee = EarlyExit(<decisionNumber>)
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@earlyExitException()><\n>
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    raise eee
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  match_count_<decisionNumber> += 1
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend<\n>
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScope(scope) ::= <<
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor:returnStructName(r=it)> = define_return_scope <scope.attributes:{it | :<it.decl>}; separator=", ">
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
417324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnStructName(r) ::= "<r.name; format=\"camelcase\">ReturnValue"
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
419324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeClass ::= globalAttributeScopeClass
420324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeStack ::= globalAttributeScopeStack
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
422324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBacktrackFailure() ::= <<
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@state.backtracking > 0 and raise( ANTLR3::Error::BacktrackingFailed )<\n>
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
428324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBody() ::= <<
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)><if(backtracking)>
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversuccess = false # flag used for memoization<\n>
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><endif>
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleMemoization(ruleName)><block><ruleCleanUp()><(ruleDescriptor.actions.after):execAction()>
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)><if(backtracking)>
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  success = true<\n>
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><endif>
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(exceptions)>
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!emptyRule)>
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).rulecatch)>
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - - - - - - - - @rulecatch - - - - - - - -
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).rulecatch>
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrescue ANTLR3::Error::RecognitionError => re
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  report_error(re)
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  recover(re)
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@setErrorReturnValue()>
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverensure
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <traceOut()><memoize()><ruleScopeCleanUp()><finally>
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
459324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleReturnValue() ::= <%
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasReturnValue)>
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnName>
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverreturn_value
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
472324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarations() ::= <<
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverreturn_value = <returnStructName(r=ruleDescriptor)>.new
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# $rule.start = the first token seen before matching
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverreturn_value.start = @input.look<\n>
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{a|<a.name> = <if(a.initValue)><a.initValue><else>nil<endif><\n>}>
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.name>_start_index = @input.index<\n>
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
486324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDef(label) ::= <<
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label.label.text; format="label"> = nil<\n>
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
490324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefs() ::= <<
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ruleDescriptor.tokenLabels,
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ruleDescriptor.tokenListLabels,
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ruleDescriptor.wildcardTreeLabels,
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ruleDescriptor.wildcardTreeListLabels,
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ruleDescriptor.ruleLabels,
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ruleDescriptor.ruleListLabels
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ]:
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {<it.label.text; format="label"> = nil<\n>}
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver><[
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ruleDescriptor.tokenListLabels,
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ruleDescriptor.ruleListLabels,
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ruleDescriptor.wildcardTreeListLabels
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ]:
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  {list_of_<it.label.text; format="label"> = []<\n>}
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* * * * * * * * * * * * * R U L E   H E L P E R S * * * * * * * * * * * * */
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
511324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertraceIn() ::= <<
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(trace)>
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertrace_in( __method__, <ruleDescriptor.index> )<\n>
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# -> uncomment the next line to manually enable rule tracing
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# trace_in( __method__, <ruleDescriptor.index> )<\n>
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
520324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertraceOut() ::= <<
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(trace)>
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertrace_out( __method__, <ruleDescriptor.index> )<\n>
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# -> uncomment the next line to manually enable rule tracing
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# trace_out( __method__, <ruleDescriptor.index> )<\n>
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
529324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= <<
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!TREE_PARSER)>
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - - - - - - - rule clean up - - - - - - - -
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverreturn_value.stop = @input.look( -1 )<\n>
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
538324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleMemoization(name) ::= <<
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# rule memoization
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif @state.backtracking > 0 and already_parsed_rule?( __method__ )
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  success = true
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  return <ruleReturnValue()>
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend<\n>
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
549324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeSetUp() ::= <<
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{it | @<it>_stack.push( @@<it>.new )<\n>}><ruleDescriptor.ruleScope:{it | @<it.name>_stack.push( @@<it.name>.new )<\n>}>
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
553324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeCleanUp() ::= <<
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{it | @<it>_stack.pop<\n>}><ruleDescriptor.ruleScope:{it | @<it.name>_stack.pop<\n>}>
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermemoize() ::= <<
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)><if(backtracking)>
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermemoize( __method__, <ruleDescriptor.name>_start_index, success ) if @state.backtracking > 0<\n>
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><endif>
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** helper template to format a ruby method call */
564324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermethodCall(n, del, args) ::= <<
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(del)>@<del:delegateName()>.<endif><n><if(args)>( <args; separator=", "> )<endif>
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* * * * * * * * * * * * * L E X E R   P A R T S * * * * * * * * * * * * * */
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
570324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveractionGate() ::= "@state.backtracking == 0"
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (...) subrule with multiple alternatives */
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverblock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# at line <description>
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt_<decisionNumber> = <maxAlt>
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@body><blockBody()><@end>
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A rule block with multiple alternatives */
581324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# at line <description>
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt_<decisionNumber> = <maxAlt>
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@decision><decision><@end>
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase alt_<decisionNumber>
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts:{a | <altSwitchCase(i,a)>}; separator="\n">
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
591324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A special case of a (...) subrule with a single alternative */
598324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverblockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# at line <description>
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)+ block with 0 or more alternatives */
606324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# at file <description>
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@loopBody>
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<positiveClosureBlockLoop()>
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
614324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlockSingleAlt ::= positiveClosureBlock
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)* block with 0 or more alternatives */
617324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# at line <description>
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@loopBody>
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<closureBlockLoop()>
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
625324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlockSingleAlt ::= closureBlock
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Optional blocks (x)? are translated to (x|) by before code
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * generation so we can just use the normal block template
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
630324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlock ::= block
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
632324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlockSingleAlt ::= block
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An alternative is just a list of elements; at outermost
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * level
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# at line <description>
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<elements:element()><rew>
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a token optionally with a label in front */
643324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex,terminalOptions) ::= <<
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label; format="label"> = <endif>match( <token>, TOKENS_FOLLOWING_<token>_IN_<ruleName>_<elementIndex> )
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID */
648324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)>
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<addToList(elem={<label; format="label">},...)>
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* TRY THIS:
654324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlist_of_<label; format="label"> << match( <token>, TOKENS_FOLLOWING_<token>_IN_<ruleName>_<elementIndex> )
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
659324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddToList(label,elem) ::= <<
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlist_of_<label; format="label"> \<\< <elem><\n>
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
663324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabel ::= addToList
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** For now, sets are interval tests and must be tested inline */
666324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,elementIndex,terminalOptions,postmatchCode) ::= <<
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label"> = @input.look<\n>
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif <s>
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @input.consume
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <postmatchCode>
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)>
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @state.error_recovery = false<\n>
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleBacktrackFailure()>
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  mse = MismatchedSet( nil )
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@mismatchedSetException()>
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  recover mse
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise mse<\n>
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise mse<\n>
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
691324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)>
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<addToList(elem={<label; format="label">},...)>
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
696324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchRuleBlockSet ::= matchSet
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(token,label,elementIndex,terminalOptions) ::= <<
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label"> = @input.look<\n>
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch_any
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* TRY THIS:
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(label,elementIndex) ::= <<
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label; format="label"> = <endif>match_any
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
711324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcard(...)>
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<addToList(elem={<label; format="label">},...)>
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a rule reference by invoking it possibly with
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * arguments and a return value or values.
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
720324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args,scope) ::= <<
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@state.following.push( TOKENS_FOLLOWING_<rule.name>_IN_<ruleName>_<elementIndex> )
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label; format="label"> = <endif><methodCall(del=scope, n={<rule.name>}, args=args)>
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@state.following.pop
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID */
727324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)>
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<addToList(elem={<label; format="label">},...)>
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match ^(root children) in tree parser */
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree(root, actionsAfterRoot, children, nullableChildList, enclosingTreeLevel, treeLevel) ::= <<
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<root:element()>
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actionsAfterRoot:element()>
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nullableChildList)>
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif @input.peek == DOWN
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  match( DOWN, nil )
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <children:element()>
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  match( UP, nil )
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch( DOWN, nil )
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<children:element()>
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch( UP, nil )
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Every predicate is used as a validating predicate (even when
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * it is also hoisted into a prediction expression).
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
752324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvervalidateSemanticPredicate(pred,description) ::= <<
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverunless ( <evalPredicate(...)> )
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleBacktrackFailure()>
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise FailedPredicate( "<ruleName>", "<description>" )
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverraise FailedPredicate( "<ruleName>", "<description>" ) unless ( <evalPredicate(...)> )
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
763324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlook_<decisionNumber>_<stateNumber> = @input.peek( <k> )<\n>
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nels">
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  alt_<decisionNumber> = <eotPredictsAlt><\n>
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleBacktrackFailure()><\n>
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@noViableAltException>
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise NoViableAlternative( "<description>", <decisionNumber>, <stateNumber> )<\n>
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Same as a normal DFA state except that we don't examine
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * look for the bypass alternative.  It delays error
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * detection but this is faster, smaller, and more what people
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * expect.  For (X)? people expect "if ( LA(1)==X ) match(X);"
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * and that's it. *  If a semPredState, don't force look
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * lookup; preds might not need.
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
787324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlook_<decisionNumber>_<stateNumber> = @input.peek( <k> )<\n>
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nels">
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state that is actually the loopback decision of a
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * closure loop.  If end-of-token (EOT) predicts any of the
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * targets then it should act like a default clause (i.e., no
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * error can be generated). This is used only in the lexer so
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * that for ('a')* on the end of a rule anything other than 'a'
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * predicts exiting. *  If a semPredState, don't force
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * look lookup; preds might not need.
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
802324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlook_<decisionNumber>_<stateNumber> = @input.peek( <k> )<\n>
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nels"><\n>
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  alt_<decisionNumber> = <eotPredictsAlt><\n>
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An accept state indicates a unique alternative has been
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * predicted
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
816324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaAcceptState(alt) ::= "alt_<decisionNumber> = <alt>"
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simple edge with an expression.  If the expression is
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * satisfied, enter to the target state.  To handle gated
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * productions, we may have to evaluate some predicates for
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * this edge.
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
823324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdge(labelExpr, targetState, predicates) ::= <<
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <labelExpr> )<if(predicates)> and ( <predicates> )<endif>
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <targetState>
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state where a SWITCH may be generated.  The code
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * generator decides if this is possible:
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * CodeGenerator.canGenerateSwitch().
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
833324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase look_<decisionNumber> = @input.peek( <k> )
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n">
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  alt_<decisionNumber> = <eotPredictsAlt><\n>
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleBacktrackFailure()><\n>
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@noViableAltException>
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise NoViableAlternative( "<description>", <decisionNumber>, <stateNumber> )<\n>
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
851324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockStateSwitch(k, edges, eotPredictsAlt, description, stateNumber, semPredState) ::= <<
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase look_<decisionNumber> = @input.peek( <k> )
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n">
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
857324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackStateSwitch(k, edges, eotPredictsAlt, description, stateNumber, semPredState) ::= <<
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase look_<decisionNumber> = @input.peek( <k> )
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n">
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  alt_<decisionNumber> = <eotPredictsAlt>
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
867324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdgeSwitch(labels, targetState) ::= <<
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwhen <labels:{it | <it>}; separator=", "> then <targetState>
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The code to initiate execution of a cyclic DFA; this is used
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * in the rule to predict an alt just like the fixed DFA case.
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * The <name> attribute is inherited via the parser, lexer, ...
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
875324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaDecision(decisionNumber, description) ::= <<
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt_<decisionNumber> = @dfa<decisionNumber>.predict( @input )
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Generate the tables and support code needed for the DFAState
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * object argument.  Unless there is a semantic predicate (or
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * syn pred, which become sem preds), all states should be
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * encoded in the state tables. Consequently,
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * cyclicDFAState/cyclicDFAEdge,eotDFAEdge templates are not
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * used except for special DFA states that cannot be encoded as
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * a transition table.
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
887324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFA(dfa) ::= <<
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass DFA<dfa.decisionNumber> \< ANTLR3::DFA
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EOT = unpack( <dfa.javaCompressedEOT; anchor, separator=", ", wrap="\n"> )
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EOF = unpack( <dfa.javaCompressedEOF; anchor, separator=", ", wrap="\n"> )
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MIN = unpack( <dfa.javaCompressedMin; anchor, separator=", ", wrap="\n"> )
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MAX = unpack( <dfa.javaCompressedMax; anchor, separator=", ", wrap="\n"> )
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ACCEPT = unpack( <dfa.javaCompressedAccept; anchor, separator=", ", wrap="\n"> )
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SPECIAL = unpack( <dfa.javaCompressedSpecial; anchor, separator=", ", wrap="\n"> )
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TRANSITION = [
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <dfa.javaCompressedTransition:{s|unpack( <s; wrap="\n", anchor, separator=", "> )}; separator=",\n">
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ].freeze
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ( 0 ... MIN.length ).zip( MIN, MAX ) do | i, a, z |
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if a \> 0 and z \< 0
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MAX[ i ] %= 0x10000
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @decision = <dfa.decisionNumber>
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <@errorMethod()>
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.description)>
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def description
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    \<\<-'__dfa_description__'.strip!
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <dfa.description>
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    __dfa_description__
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end<\n>
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend<\n>
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
920324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverspecialStateTransitionMethod(dfa) ::= <<
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef special_state_transition_for_dfa<dfa.decisionNumber>(s, input)
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  case s
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <dfa.specialStateSTs:{state|when <i0>
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <state>}; separator="\n">
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @state.backtracking > 0 and raise ANTLR3::Error::BacktrackingFailed<\n>
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  nva = ANTLR3::Error::NoViableAlternative.new( @dfa<dfa.decisionNumber>.description, <dfa.decisionNumber>, s, input )
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @dfa<dfa.decisionNumber>.error( nva )
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise nva
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
935324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFASynpred( name ) ::= <<
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef <name>() @recognizer.<name> end<\n>
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
939324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAInit(dfa) ::= <<
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)>
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@dfa<dfa.decisionNumber> = DFA<dfa.decisionNumber>.new( self, <dfa.decisionNumber> ) do |s|
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  case s
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <dfa.specialStateSTs:{state|when <i0>
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <state>}; separator="\n">
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if s \< 0
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @state.backtracking > 0 and raise ANTLR3::Error::BacktrackingFailed<\n>
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nva = ANTLR3::Error::NoViableAlternative.new( @dfa<dfa.decisionNumber>.description, <dfa.decisionNumber>, s, input )
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @dfa<dfa.decisionNumber>.error( nva )
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    raise nva
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  s
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend<\n>
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@dfa<dfa.decisionNumber> = DFA<dfa.decisionNumber>.new( self, <dfa.decisionNumber> )<\n>
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A special state in a cyclic DFA; special means has a
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * semantic predicate or it's a huge set of symbols to check.
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
967324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAState(decisionNumber, stateNumber, edges, needErrorClause, semPredState) ::= <<
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlook_<decisionNumber>_<stateNumber> = @input.peek
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(semPredState)>
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverindex_<decisionNumber>_<stateNumber> = @input.index
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@input.rewind( @input.last_marker, false )<\n>
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvers = -1
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="els">end
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(semPredState)> <! return input cursor to state before we rewound !>
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@input.seek( index_<decisionNumber>_<stateNumber> )<\n>
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Just like a fixed DFA edge, test the look and indicate
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * what state to jump to next if successful.  Again, this is
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * for special states.
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
984324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <labelExpr> )<if(predicates)> and ( <predicates> )<endif>
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  s = <targetStateNumber><\n>
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An edge pointing at end-of-token; essentially matches any
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * char; always jump to the target.
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
992324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvereotDFAEdge(targetStateNumber, edgeNumber, predicates) ::= <<
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvere
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  s = <targetStateNumber><\n>
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
997324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverandPredicates(left,right) ::= "( <left> ) and ( <right> )"
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
999324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverorPredicates(operands) ::= "( <first(operands)> )<rest(operands):{o|  or ( <o> )}>"
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernotPredicate(pred) ::= "not ( <pred> )"
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalPredicate(pred,description) ::= "( <pred> )"
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalSynPredicate(pred,description) ::= <<
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversyntactic_predicate?( :<pred:{it | <it>}> )
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadTest(atom, k, atomAsInt) ::= "look_<decisionNumber>_<stateNumber> == <atom>"
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Sometimes a look test cannot assume that LA(k) is in a
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * temp variable somewhere.  Must ask for the look
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * directly.
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadTest(atom, k, atomAsInt) ::= "@input.peek(<k>) == <atom>"
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadRangeTest(lower, upper, k, rangeNumber, lowerAsInt, upperAsInt) ::= <<
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlook_<decisionNumber>_<stateNumber>.between?( <lower>, <upper> )
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadRangeTest(lower, upper, k, rangeNumber, lowerAsInt, upperAsInt) ::= <<
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@input.peek( <k> ).between?( <lower>, <upper> )
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTest(ranges) ::= <<
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ranges; separator=" || ">
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterAttributeRef(attr) ::= "<attr.name>"
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterSetAttributeRef(attr,expr) ::= "<attr.name> = <expr>"
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeAttributeRef(scope, attr, index, negIndex) ::= <<
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@<scope>_stack[ -<negIndex> ].<attr.name>
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@<scope>_stack[ <index> ].<attr.name>
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@<scope>_stack.last.<attr.name>
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeSetAttributeRef(scope, attr, expr, index, negIndex) ::= <<
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@<scope>_stack[ -<negIndex> ].<attr.name> = <expr>
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@<scope>_stack[ <index> ].<attr.name> = <expr>
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@<scope>_stack.last.<attr.name> = <expr>
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $x is either global scope or x is rule with dynamic scope;
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * refers to stack itself not top of stack.  This is useful for
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * predicates like {$function.size()>0 &&
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * $function::name.equals("foo")}?
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedDynamicScopeRef(scope) ::= "@<scope>_stack"
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** reference an attribute of rule; might only have single
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * return value
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelRef(referencedRule, scope, attr) ::= <<
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver( <scope; format="label">.nil? ? nil : <scope; format="label">.<attr.name> )
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope; format="label">
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnAttributeRef(ruleDescriptor, attr) ::= <<
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverreturn_value.<attr.name>
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name>
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnSetAttributeRef(ruleDescriptor, attr, expr) ::= <<
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverreturn_value.<attr.name> = <expr>
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name> = <expr>
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to translate $tokenLabel */
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelRef(label) ::= "<label; format=\"label\">"
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID {$ids} or e+=expr {$e} */
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelRef(label) ::= "list_of_<label; format=\"label\">"
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_text(scope, attr) ::= "<scope; format=\"label\">.text"
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_type(scope, attr) ::= "<scope; format=\"label\">.type"
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_line(scope, attr) ::= "<scope; format=\"label\">.line"
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_pos(scope, attr) ::= "<scope; format=\"label\">.column"
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_channel(scope, attr) ::= "<scope; format=\"label\">.channel"
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_index(scope, attr) ::= "<scope; format=\"label\">.index"
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_tree(scope, attr) ::= "tree_for_<scope>"
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_start(scope, attr) ::= "<scope; format=\"label\">.start"
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_stop(scope, attr) ::= "<scope; format=\"label\">.stop"
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_tree(scope, attr) ::= "<scope; format=\"label\">.tree"
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_text(scope, attr) ::= <<
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @input.token_stream.to_s(
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @input.tree_adaptor.token_start_index( <scope; format="label">.start ),
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @input.tree_adaptor.token_stop_index( <scope; format="label">.start )
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ) if <scope; format="label">
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver)
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver( <scope; format="label"> && @input.to_s( <scope; format="label">.start, <scope; format="label">.stop ) )
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_st(scope, attr) ::= "( <scope; format=\"label\"> && <scope; format=\"label\">.template )"
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/******************************************************************************
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *****************  L E X E R - O N L Y   T E M P L A T E S  ******************
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ******************************************************************************/
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerSynpred(name) ::= ""
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlexer(grammar, name, tokens, scopes, rules, numRules, labelType="ANTLR3::Token", filterMode, superClass="ANTLR3::Lexer") ::= <<
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)><autoloadDelegates()><endif>
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass <if(grammar.delegator)><grammar.name><else>Lexer<endif> \< <superClass>
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @grammar_home = <grammar.name>
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!grammar.grammarIsRoot)>
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <autoloadDelegates()><\n>
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  include TokenData
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)>
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  include ANTLR3::FilterMode<\n>
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeClass()><\n><endif>}>
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    generated_using( "<fileName>", "<ANTLRVersion>", "<runtimeLibraryVersion()>" )
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  rescue NoMethodError => error
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # ignore
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RULE_NAMES   = [ <trunc(rules):{r|"<r.ruleName>"}; separator=", ", wrap="\n", anchor> ].freeze
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RULE_METHODS = [ <trunc(rules):{r|:<r.ruleName; format="lexerRule">}; separator=", ", wrap="\n", anchor> ].freeze
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegators)>
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  masters( <grammar.delegators:{d|:<d.name>}; separator=", "> )<\n>
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)>
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  imports( <grammar.directDelegates:{d|:<d.name>}; separator=", "> )<\n>
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( <grammar.delegators:{g|<g:delegateName()>, }>input=nil, options = {} )
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( input, options )
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @state.rule_memory = {}<\n>
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <grammar.delegators:{g|@<g:delegateName()> = <g:delegateName()><\n>}><grammar.directDelegates:{g|@<g:delegateName()> = <newDelegate(g)><\n>}><last(grammar.delegators):{g|@parent = @<g:delegateName()><\n>}><placeAction(scope="lexer",name="init")>
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <placeAction(scope="lexer",name="members")>
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # - - - - - - - - - - - lexer rules - - - - - - - - - - - -
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <rules:{it | <it><\n>}>
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegatedRules)>
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # - - - - - - - - - - delegated rules - - - - - - - - - - -
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <grammar.delegatedRules:{ruleDescriptor|<delegateLexerRule(ruleDescriptor)><\n><\n>}>
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(cyclicDFAs)>
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # - - - - - - - - - - DFA definitions - - - - - - - - - - -
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <cyclicDFAs:cyclicDFA()>
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  private
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize_dfas
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super rescue nil
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <cyclicDFAs:cyclicDFAInit()>
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # class <if(grammar.delegator)><grammar.name><else>Lexer<endif> \< <superClass>
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!actions.(actionScope).main)>
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverat_exit { <if(grammar.delegator)><grammar.name><else>Lexer<endif>.main( ARGV ) } if __FILE__ == $0
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelDefs() ::= <<
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if([ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels,ruleDescriptor.ruleLabels,ruleDescriptor.charLabels,ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels])>
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - - - - label initialization - - - -
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels,ruleDescriptor.ruleLabels,ruleDescriptor.charLabels]:{it | <it.label.text; format="label"> = nil<\n>}>
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]:{it | list_of_<it.label.text; format="label"> = [] unless defined?(list_of_<it.label.text; format="label">)<\n>}>
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a rule in the lexer; naked blocks are used
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * for fragment rules.
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# lexer rule <ruleName; format="lexerRule"> (<ruleName>)
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# (in <fileName>)
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef <ruleName; format="lexerRule"><if(ruleDescriptor.parameterScope)>( <ruleDescriptor.parameterScope:parameterScope()> )<endif>
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <traceIn()><ruleScopeSetUp()><ruleDeclarations()><if(memoize)>
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # backtracking success
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  success = false<\n>
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nakedBlock)>
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleMemoization({<ruleName; format="lexerRule">})><lexerRuleLabelDefs()><action(name="init", code=ruleDescriptor.actions.init)>
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # - - - - main rule block - - - -
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <block>
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  type = <ruleName>
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  channel = ANTLR3::DEFAULT_CHANNEL
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleMemoization(ruleName)><lexerRuleLabelDefs()><action(name="init", code=ruleDescriptor.actions.init)>
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # - - - - main rule block - - - -
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <block>
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <ruleCleanUp()>
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @state.type = type
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @state.channel = channel
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<(ruleDescriptor.actions.after):execAction()>
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)><if(backtracking)>
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  success = false<\n>
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><endif>
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverensure
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <traceOut()><ruleScopeCleanUp()><memoize()>
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! <if(ruleDescriptor.modifier)>
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.modifier> :<ruleName; format="lexerRule"><\n>
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> !>
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Isolated $RULE ref ok in lexer as it's a Token */
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabel(label) ::= "<label; format=\"label\">"
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_line(scope, attr) ::= "<scope; format=\"label\">.line"
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_type(scope, attr) ::= "<scope; format=\"label\">.type"
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_pos(scope, attr) ::= "<scope; format=\"label\">.column"
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_channel(scope, attr) ::= "<scope; format=\"label\">.channel"
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_index(scope, attr) ::= "<scope; format=\"label\">.index"
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_text(scope, attr) ::= "<scope; format=\"label\">.text"
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for the implicitly-defined lexer
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * grammar rule that chooses between lexer rules.
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# main rule used to study the input at the current position,
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# and choose the proper lexer rule to call in order to
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# fetch the next token
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# usually, you don't make direct calls to this method,
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# but instead use the next_token method, which will
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# build and emit the actual next token
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef <ruleName; format="lexerRule">
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <block>
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_text(scope, attr) ::= "self.text"
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_type(scope, attr) ::= "type"
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_line(scope, attr) ::= "@state.token_start_line"
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_pos(scope, attr)  ::= "@state.token_start_column"
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Undefined, but present for consistency with Token
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  * attributes; set to -1
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_index(scope, attr) ::= "-1"
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_channel(scope, attr) ::= "channel"
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_start(scope, attr) ::= "@state.token_start_position"
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_stop(scope, attr) ::= "( self.character_index - 1 )"
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A lexer rule reference */
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRef(rule,label,args,elementIndex,scope) ::= <<
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label">_start_<elementIndex> = self.character_index
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<methodCall(n={<rule.name; format="lexerRule">},del=scope,args=args)>
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label"> = create_token do |t|
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.input   = @input
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.type    = ANTLR3::INVALID_TOKEN_TYPE
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.channel = ANTLR3::DEFAULT_CHANNEL
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.start   = <label; format="label">_start_<elementIndex>
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.stop    = self.character_index - 1
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<methodCall(n={<rule.name; format="lexerRule">}, del=scope, args=args)>
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** i+=INT in lexer */
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= <<
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<lexerRuleRef(...)>
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<addToList(elem={<label; format="label">},...)>
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match . wildcard in lexer */
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardChar(label, elementIndex) ::= <<
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label"> = @input.peek<\n>
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch_any
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardCharListLabel(label, elementIndex) ::= <<
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcardChar(...)>
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<addToList(elem={<label; format="label">},...)>
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character */
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRef(char,label) ::= <<
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label"> = @input.peek<\n>
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch( <char> )
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character range */
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRangeRef(a,b,label) ::= <<
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label"> = @input.peek<\n>
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch_range( <a>, <b> )
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringNextToken() ::= ""
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringActionGate() ::= "@state.backtracking == 1"
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a string literal */
1353324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerStringRef(string,label,elementIndex) ::= <<
1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label">_start = self.character_index
1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch( <string> )
1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label"> = create_token do |t|
1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.input   = @input
1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.type    = ANTLR3::INVALID_TOKEN_TYPE
1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.channel = ANTLR3::DEFAULT_CHANNEL
1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.start   = <label; format="label">_start
1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.stop    = character_index - 1
1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch( <string> )
1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** EOF in the lexer */
1371324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerMatchEOF(label,elementIndex) ::= <<
1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label">_start_<elementIndex> = character_index
1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch( ANTLR3::EOF )
1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label; format="label"> = create_token do |t|
1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.input   = @input
1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.type    = ANTLR3::INVALID_TOKEN_TYPE
1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.channel = ANTLR3::DEFAULT_CHANNEL
1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.start   = <label; format="label">_start_<elementIndex>
1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  t.stop    = character_index - 1
1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend<\n>
1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch( ANTLR3::EOF )<\n>
1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// used for left-recursive rules
1388324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleDefArg()                       ::= "int <recRuleArg()>"
1389324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleArg()                          ::= "_p"
1390324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleAltPredicate(ruleName,opPrec)  ::= "<recRuleArg()> \<= <opPrec>"
1391324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleSetResultAction()              ::= "root_0=$<ruleName>_primary.tree;"
1392324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleSetReturnAction(src,name)      ::= "$<name>=$<src>.<name>;"
1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $start in parser rule */
1395324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_start(scope, attr) ::= "return_value.start"
1396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $stop in parser rule */
1398324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_stop(scope, attr) ::= "return_value.stop"
1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $tree in parser rule */
1401324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_tree(scope, attr) ::= "return_value.tree"
1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $text in parser rule */
1404324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_text(scope, attr) ::= "@input.to_s( return_value.start, @input.look( -1 ) )"
1405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $template in parser rule */
1407324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_st(scope, attr) ::= "return_value.template"
1408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1409324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_tree(scope, attr, expr) ::= "return_value.tree = <expr>"
1410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1411324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_st(scope, attr, expr) ::= "return_value.template = <expr>"
1412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to execute an action */
1414324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecAction(action) ::= <<
1415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# syntactic predicate action gate test
1417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif <actions.(actionScope).synpredgate>
1418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # --> action
1419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <action>
1420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # \<-- action
1421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
1422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# --> action
1424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<action>
1425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# \<-- action
1426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1429324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercodeFileExtension() ::= ".rb"
1430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertrue()  ::= "true"
1432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfalse() ::= "false"
1433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveraction(name, code) ::= <<
1435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(code)>
1436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - - - - @<name> action - - - -
1437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<code><\n>
1438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1441324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverautoloadDelegates() ::= <<
1442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)>
1443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<grammar.directDelegates:{it | autoload :<it.name>, "<it.recognizerName>"<\n>}>
1444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1447324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateLexerRule(ruleDescriptor) ::= <<
1448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# delegated lexer rule <ruleDescriptor.name; format="lexerRule"> (<ruleDescriptor.name> in the grammar)
1449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef <ruleDescriptor.name; format="lexerRule"><if(ruleDescriptor.parameterScope)>( <ruleDescriptor.parameterScope:parameterScope()> )<endif>
1450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <methodCall(del=ruleDescriptor.grammar, n={<ruleDescriptor.name; format="lexerRule">}, args=ruleDescriptor.parameterScope.attributes)>
1451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
1452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1454324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrootClassName() ::= <<
1455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)><grammar.name><else><grammar.composite.rootGrammar.name><endif>::<if(TREE_PARSER)>TreeParser<elseif(PARSER)>Parser<else>Lexer<endif>
1456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1458324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergrammarClassName() ::= <<
1459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<gram.name>::<if(TREE_PARSER)>TreeParser<elseif(PARSER)>Parser<else>Lexer<endif>
1460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1462324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewDelegate(gram) ::= <<
1463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<gram.name>.new( <trunc(gram.delegators):{p|<p:delegateName()>, }>
1464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  self, @input, :state => @state<@delegateOptions()>
1465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver)
1466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1468324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverplaceAction(scope, name) ::= <<
1469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(scope).(name))>
1470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - - - - - - begin action @<scope>::<name> - - - - - -
1471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(fileName)># <fileName><\n><endif>
1472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(scope).(name)>
1473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - - - - - - end action @<scope>::<name> - - - - - - -<\n>
1474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1477324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruntimeLibraryVersion() ::= "1.8.1"
1478