antlr4 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +27 -0
  3. data/README.md +46 -0
  4. data/lib/antlr4.rb +262 -0
  5. data/lib/antlr4/BufferedTokenStream.rb +306 -0
  6. data/lib/antlr4/CommonTokenFactory.rb +53 -0
  7. data/lib/antlr4/CommonTokenStream.rb +56 -0
  8. data/lib/antlr4/FileStream.rb +14 -0
  9. data/lib/antlr4/InputStream.rb +82 -0
  10. data/lib/antlr4/IntervalSet.rb +341 -0
  11. data/lib/antlr4/LL1Analyzer.rb +177 -0
  12. data/lib/antlr4/Lexer.rb +335 -0
  13. data/lib/antlr4/ListTokenSource.rb +140 -0
  14. data/lib/antlr4/Parser.rb +562 -0
  15. data/lib/antlr4/ParserInterpreter.rb +149 -0
  16. data/lib/antlr4/ParserRuleContext.rb +162 -0
  17. data/lib/antlr4/PredictionContext.rb +690 -0
  18. data/lib/antlr4/Recognizer.rb +162 -0
  19. data/lib/antlr4/RuleContext.rb +226 -0
  20. data/lib/antlr4/Token.rb +124 -0
  21. data/lib/antlr4/TokenFactory.rb +3 -0
  22. data/lib/antlr4/TokenSource.rb +4 -0
  23. data/lib/antlr4/TokenStream.rb +3 -0
  24. data/lib/antlr4/TraceListener.rb +23 -0
  25. data/lib/antlr4/atn/ATN.rb +133 -0
  26. data/lib/antlr4/atn/ATNConfig.rb +146 -0
  27. data/lib/antlr4/atn/ATNConfigSet.rb +215 -0
  28. data/lib/antlr4/atn/ATNDeserializationOptions.rb +62 -0
  29. data/lib/antlr4/atn/ATNDeserializer.rb +604 -0
  30. data/lib/antlr4/atn/ATNSimulator.rb +43 -0
  31. data/lib/antlr4/atn/ATNState.rb +253 -0
  32. data/lib/antlr4/atn/ATNType.rb +22 -0
  33. data/lib/antlr4/atn/LexerATNSimulator.rb +612 -0
  34. data/lib/antlr4/atn/LexerAction.rb +311 -0
  35. data/lib/antlr4/atn/LexerActionExecutor.rb +134 -0
  36. data/lib/antlr4/atn/ParserATNSimulator.rb +1622 -0
  37. data/lib/antlr4/atn/PredictionMode.rb +525 -0
  38. data/lib/antlr4/atn/SemanticContext.rb +355 -0
  39. data/lib/antlr4/atn/Transition.rb +297 -0
  40. data/lib/antlr4/base.rb +60 -0
  41. data/lib/antlr4/dfa/DFA.rb +128 -0
  42. data/lib/antlr4/dfa/DFASerializer.rb +77 -0
  43. data/lib/antlr4/dfa/DFAState.rb +133 -0
  44. data/lib/antlr4/error.rb +151 -0
  45. data/lib/antlr4/error/DiagnosticErrorListener.rb +136 -0
  46. data/lib/antlr4/error/ErrorListener.rb +109 -0
  47. data/lib/antlr4/error/ErrorStrategy.rb +742 -0
  48. data/lib/antlr4/tree/Chunk.rb +31 -0
  49. data/lib/antlr4/tree/ParseTreeMatch.rb +105 -0
  50. data/lib/antlr4/tree/ParseTreePattern.rb +70 -0
  51. data/lib/antlr4/tree/ParseTreePatternMatcher.rb +334 -0
  52. data/lib/antlr4/tree/RuleTagToken.rb +39 -0
  53. data/lib/antlr4/tree/TokenTagToken.rb +38 -0
  54. data/lib/antlr4/tree/Tree.rb +204 -0
  55. data/lib/antlr4/tree/Trees.rb +111 -0
  56. data/lib/antlr4/version.rb +5 -0
  57. data/lib/antlr4/xpath/XPath.rb +354 -0
  58. data/lib/double_key_map.rb +78 -0
  59. data/lib/java_symbols.rb +24 -0
  60. data/lib/uuid.rb +87 -0
  61. data/test/test_intervalset.rb +664 -0
  62. data/test/test_tree.rb +140 -0
  63. data/test/test_uuid.rb +122 -0
  64. metadata +109 -0
@@ -0,0 +1,62 @@
1
+
2
+
3
+ class ATNDeserializationOptions
4
+
5
+ @@defaultOptions = nil
6
+ def self.defaultOptions
7
+ if @@defaultOptions.nil?
8
+ @@defaultOptions = new
9
+ @@defaultOptions.makeReadOnly()
10
+ end
11
+ @@defaultOptions
12
+ end
13
+
14
+ attr_accessor :readonly, :verifyATN ,:generateRuleBypassTransitions
15
+ def initialize(options=nil )
16
+ if options.nil?
17
+ @verifyATN = true
18
+ @generateRuleBypassTransitions = false
19
+ else
20
+ @verifyATN = options.verifyATN
21
+ @generateRuleBypassTransitions = options.generateRuleBypassTransitions
22
+ end
23
+
24
+ end
25
+ def self.getDefaultOptions()
26
+ self.defaultOptions
27
+ end
28
+ def isReadOnly
29
+ self.readonly
30
+ end
31
+ def makeReadOnly()
32
+ self.readonly = true
33
+ end
34
+
35
+ def verifyATN=(verifyATN)
36
+ throwIfReadOnly()
37
+ @verifyATN = verifyATN
38
+ end
39
+ def isVerifyATN()
40
+ self.verifyATN
41
+ end
42
+ def setVerifyATN(verifyATN)
43
+ self.verifyATN = verifyATN
44
+ end
45
+
46
+ def isGenerateRuleBypassTransitions()
47
+ self.generateRuleBypassTransitions
48
+ end
49
+ def setGenerateRuleBypassTransitions(generateRuleBypassTransitions)
50
+ self.generateRuleBypassTransitions = generateRuleBypassTransitions
51
+ end
52
+ def generateRuleBypassTransitions=(generateRuleBypassTransitions)
53
+ throwIfReadOnly()
54
+ @generateRuleBypassTransitions = generateRuleBypassTransitions
55
+ end
56
+ protected
57
+ def throwIfReadOnly()
58
+ if isReadOnly() then
59
+ raise IllegalStateException.new("The object is read only.")
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,604 @@
1
+ # This is the earliest supported serialized UUID.
2
+ BASE_SERIALIZED_UUID = UUID.new("AADB8D7E-AEEF-4415-AD2B-8204D6CF042E")
3
+
4
+ # This list contains all of the currently supported UUIDs, ordered by when
5
+ # the feature first appeared in this branch.
6
+ SUPPORTED_UUIDS = [ BASE_SERIALIZED_UUID ]
7
+
8
+ SERIALIZED_VERSION = 3
9
+
10
+ # This is the current serialized UUID.
11
+ SERIALIZED_UUID = BASE_SERIALIZED_UUID
12
+
13
+ class ATNDeserializer
14
+
15
+ attr_accessor :deserializationOptions
16
+ attr_accessor :edgeFactories,:stateFactories,:actionFactories
17
+ attr_accessor :data, :uuid
18
+ attr :pos
19
+ def initialize(options=nil)
20
+ if options.nil?
21
+ options = ATNDeserializationOptions.defaultOptions
22
+ end
23
+ self.deserializationOptions = options
24
+ self.edgeFactories = nil
25
+ self.stateFactories = nil
26
+ self.actionFactories = nil
27
+ end
28
+
29
+ # Determines if a particular serialized representation of an ATN supports
30
+ # a particular feature, identified by the {@link UUID} used for serializing
31
+ # the ATN at the time the feature was first introduced.
32
+ #
33
+ # @param feature The {@link UUID} marking the first time the feature was
34
+ # supported in the serialized ATN.
35
+ # @param actualUuid The {@link UUID} of the actual serialized ATN which is
36
+ # currently being deserialized.
37
+ # @return {@code true} if the {@code actualUuid} value represents a
38
+ # serialized ATN at or after the feature identified by {@code feature} was
39
+ # introduced; otherwise, {@code false}.
40
+
41
+ def isFeatureSupported(feature, actualUuid)
42
+ idx1 = SUPPORTED_UUIDS.index(feature)
43
+ if idx1<0
44
+ return false
45
+ end
46
+ idx2 = SUPPORTED_UUIDS.index(actualUuid)
47
+ return idx2 >= idx1
48
+ end
49
+
50
+ def deserialize(data)
51
+ self.reset(data)
52
+ self.checkVersion()
53
+ self.checkUUID()
54
+ atn = self.readATN()
55
+ self.readStates(atn)
56
+ self.readRules(atn)
57
+ self.readModes(atn)
58
+ sets = self.readSets(atn)
59
+ self.readEdges(atn, sets)
60
+ self.readDecisions(atn)
61
+ self.readLexerActions(atn)
62
+ self.markPrecedenceDecisions(atn)
63
+ self.verifyATN(atn)
64
+ if self.deserializationOptions.generateRuleBypassTransitions \
65
+ and atn.grammarType == ATNType.PARSER
66
+ self.generateRuleBypassTransitions(atn)
67
+ # re-verify after modification
68
+ self.verifyATN(atn)
69
+ end
70
+ return atn
71
+ end
72
+ def reset(_data)
73
+ #for (int i = 1; i < data.length; i++) {
74
+ # data[i] = (char)(data[i] - 2);
75
+ # don't adjust the first value since that's the version number
76
+ temp = Array.new(_data.length)
77
+ temp = _data
78
+ ver = _data[1]
79
+ temp[1] = (_data[1].ord + 2)
80
+ self.data = temp
81
+ @pos = 0
82
+ #puts "idx =1288 <573>: #{temp[1288].inspect} : #{_data[1288].ord.inspect} | len #{temp.length}, #{_data.length}"
83
+ end
84
+
85
+ def checkVersion()
86
+ version = self.readInt()
87
+ if version != SERIALIZED_VERSION
88
+ raise Exception.new("Could not deserialize ATN with version #{version} (expected #{SERIALIZED_VERSION}).")
89
+ end
90
+ end
91
+
92
+ def checkUUID()
93
+ uuid = self.readUUID()
94
+ if not SUPPORTED_UUIDS.member? uuid then
95
+ raise Exception.new("Could not deserialize ATN with UUID: #{uuid} (expected #{SERIALIZED_UUID} or a legacy UUID).")
96
+ end
97
+ self.uuid = uuid
98
+ end
99
+ def readATN()
100
+ idx = self.readInt()
101
+ grammarType = ATNType.fromOrdinal(idx)
102
+ maxTokenType = self.readInt()
103
+ #puts "(readATN: #{grammarType.inspect} #{maxTokenType.inspect} )"
104
+ return ATN.new(grammarType, maxTokenType)
105
+ end
106
+
107
+ def readStates(atn)
108
+ loopBackStateNumbers = Array.new
109
+ endStateNumbers = Array.new
110
+ nstates = self.readInt()
111
+ 1.upto(nstates) do |i|
112
+ stype = self.readInt()
113
+ # ignore bad type of states
114
+ if stype==ATNState::INVALID_TYPE
115
+ atn.addState(nil)
116
+ next
117
+ end
118
+ ruleIndex = self.readInt()
119
+ if ruleIndex == 0xFFFF
120
+ ruleIndex = -1
121
+ end
122
+ s = self.stateFactory(stype, ruleIndex)
123
+ if stype == ATNState::LOOP_END # special case
124
+ loopBackStateNumber = self.readInt()
125
+ loopBackStateNumbers.push([s, loopBackStateNumber])
126
+ elsif s.kind_of? BlockStartState
127
+ endStateNumber = self.readInt()
128
+ endStateNumbers.push([s, endStateNumber])
129
+ end
130
+
131
+ atn.addState(s)
132
+ end
133
+ # delay the assignment of loop back and end states until we know all the state instances have been initialized
134
+ for pair in loopBackStateNumbers do
135
+ pair[0].loopBackState = atn.states[pair[1]]
136
+ end
137
+ for pair in endStateNumbers do
138
+ pair[0].endState = atn.states[pair[1]]
139
+ end
140
+
141
+ numNonGreedyStates = self.readInt()
142
+ 1.upto(numNonGreedyStates) do |i|
143
+ stateNumber = self.readInt()
144
+ atn.states[stateNumber].nonGreedy = true
145
+ end
146
+ numPrecedenceStates = self.readInt()
147
+ 1.upto(numPrecedenceStates) do |i|
148
+ stateNumber = self.readInt()
149
+ atn.states[stateNumber].isPrecedenceRule = true
150
+ end
151
+ end
152
+ def readRules(atn)
153
+ nrules = self.readInt()
154
+ if atn.grammarType == ATNType.LEXER
155
+ atn.ruleToTokenType = Array.new(nrules, 0) # [0] * nrules
156
+ end
157
+
158
+ atn.ruleToStartState = Array.new(nrules, 0) # [0] * nrules
159
+ 0.upto(nrules - 1) do |i| #for i in range(0, nrules)
160
+ s = self.readInt()
161
+ startState = atn.states[s]
162
+ atn.ruleToStartState[i] = startState
163
+ if atn.grammarType == ATNType.LEXER
164
+ tokenType = self.readInt()
165
+ if tokenType == 0xFFFF
166
+ tokenType = Token::EOF
167
+ end
168
+ atn.ruleToTokenType[i] = tokenType
169
+ end
170
+ end
171
+ atn.ruleToStopState = Array.new(nrules, 0) #[0] * nrules
172
+ for state in atn.states do
173
+ if not state.kind_of? RuleStopState then
174
+ next
175
+ end
176
+ atn.ruleToStopState[state.ruleIndex] = state
177
+ atn.ruleToStartState[state.ruleIndex].stopState = state
178
+ end
179
+ end
180
+
181
+ def readModes(atn)
182
+ nmodes = self.readInt()
183
+ 1.upto(nmodes) do #for i in range(0, nmodes)
184
+ s = self.readInt()
185
+ atn.modeToStartState.push(atn.states[s])
186
+ end
187
+ end
188
+ #######
189
+ # List<IntervalSet> sets = new ArrayList<IntervalSet>();
190
+ # int nsets = toInt(data[p++]);
191
+ # for (int i=0; i<nsets; i++) {
192
+ # int nintervals = toInt(data[p]);
193
+ # p++;
194
+ # IntervalSet set = new IntervalSet();
195
+ # sets.add(set);
196
+ #
197
+ # boolean containsEof = toInt(data[p++]) != 0;
198
+ # if (containsEof) {
199
+ # set.add(-1);
200
+ # }
201
+ #
202
+ # for (int j=0; j<nintervals; j++) {
203
+ # set.add(toInt(data[p]), toInt(data[p + 1]));
204
+ # p += 2;
205
+ # }
206
+ # }
207
+ ###############
208
+
209
+ def readSets(atn)
210
+ sets = Array.new
211
+ m = self.readInt()
212
+ 1.upto(m) do |i| #for i in range(0, m)
213
+ iset = IntervalSet.new()
214
+ sets.push(iset)
215
+ n = self.readInt()
216
+ containsEof = self.readInt()
217
+ if containsEof !=0 then
218
+ iset.addOne(-1)
219
+ end
220
+ 1.upto(n) do |j| # for j in range(0, n)
221
+ i1 = self.readInt()
222
+ i2 = self.readInt()
223
+ iset.addRange(i1..i2)
224
+ end
225
+ end
226
+ return sets
227
+ end
228
+ def readEdges(atn, sets)
229
+ #print "Current position: #{self.pos}, "
230
+ nedges = self.readInt()
231
+ #puts "readEdges n: #{nedges} #{self.pos}"
232
+ 1.upto(nedges) do |i| #for i in range(0, nedges)
233
+ src = self.readInt()
234
+ trg = self.readInt()
235
+ ttype = self.readInt()
236
+ arg1 = self.readInt()
237
+ arg2 = self.readInt()
238
+ arg3 = self.readInt()
239
+ trans = edgeFactory(atn, ttype, src, trg, arg1, arg2, arg3, sets)
240
+ srcState = atn.states[src]
241
+ srcState.addTransition(trans)
242
+ end
243
+ # edges for rule stop states can be derived, so they aren't serialized
244
+ for state in atn.states do
245
+ state.transitions.each_index do |i| # for i in range(0, len(state.transitions))
246
+ t = state.transitions[i]
247
+ next if not t.kind_of? RuleTransition
248
+ atn.ruleToStopState[t.target.ruleIndex].addTransition(EpsilonTransition.new(t.followState))
249
+ end
250
+ end
251
+ for state in atn.states do
252
+ if state.kind_of? BlockStartState then
253
+ # we need to know the end state to set its start state
254
+ if state.endState.nil? then
255
+ raise Exception.new("IllegalState")
256
+ end
257
+ # block end states can only be associated to a single block start state
258
+ if state.endState.startState
259
+ raise Exception.new("IllegalState")
260
+ end
261
+ state.endState.startState = state
262
+ end
263
+ if state.kind_of? PlusLoopbackState then
264
+ state.transitions.each_index do |i| #for i in range(0, len(state.transitions))
265
+ target = state.transitions[i].target
266
+ if target.kind_of? PlusBlockStartState
267
+ target.loopBackState = state
268
+ end
269
+ end
270
+ elsif state.kind_of? StarLoopbackState
271
+ state.transitions.each_index do |i| #for i in range(0, len(state.transitions))
272
+ target = state.transitions[i].target
273
+ if target.kind_of? StarLoopEntryState
274
+ target.loopBackState = state
275
+ end
276
+ end
277
+ end
278
+ end
279
+ end
280
+ def readDecisions(atn)
281
+ ndecisions = self.readInt()
282
+ 1.upto(ndecisions) do |i| # for i in range(0, ndecisions)
283
+ s = self.readInt()
284
+ decState = atn.states[s]
285
+ atn.decisionToState.push(decState)
286
+ decState.decision = i
287
+ end
288
+ end
289
+ def readLexerActions(atn)
290
+ if atn.grammarType == ATNType.LEXER
291
+ count = self.readInt()
292
+ atn.lexerActions = Array.new # [ nil ] * count
293
+ 0.upto(count-1) do |i| # for i in range(0, count)
294
+ actionType = self.readInt()
295
+ data1 = self.readInt()
296
+ if data1 == 0xFFFF
297
+ data1 = -1
298
+ end
299
+ data2 = self.readInt()
300
+ if data2 == 0xFFFF
301
+ data2 = -1
302
+ end
303
+ lexerAction = self.lexerActionFactory(actionType, data1, data2)
304
+ atn.lexerActions[i] = lexerAction
305
+ end
306
+ end
307
+ end
308
+ def generateRuleBypassTransitions(atn)
309
+ count = atn.ruleToStartState.length()
310
+ atn.ruleToTokenType = Array.new(count, 0) #[ 0 ] * count
311
+ 0.upto(count-1) do |i| # for i in range(0, count)
312
+ atn.ruleToTokenType[i] = atn.maxTokenType + i + 1
313
+ end
314
+
315
+ 0.upto(count-1) do |i| # for i in range(0, count)
316
+ self.generateRuleBypassTransition(atn, i)
317
+ end
318
+ end
319
+
320
+ def generateRuleBypassTransition(atn, idx)
321
+ bypassStart = BasicBlockStartState.new()
322
+ bypassStart.ruleIndex = idx
323
+ atn.addState(bypassStart)
324
+
325
+ bypassStop = BlockEndState.new()
326
+ bypassStop.ruleIndex = idx
327
+ atn.addState(bypassStop)
328
+
329
+ bypassStart.endState = bypassStop
330
+ atn.defineDecisionState(bypassStart)
331
+
332
+ bypassStop.startState = bypassStart
333
+
334
+ excludeTransition = nil
335
+
336
+ if atn.ruleToStartState[idx].isPrecedenceRule
337
+ # wrap from the beginning of the rule to the StarLoopEntryState
338
+ endState = nil
339
+ for state in atn.states do
340
+ if self.stateIsEndStateFor(state, idx) then
341
+ endState = state
342
+ excludeTransition = state.loopBackState.transitions[0]
343
+ break
344
+ end
345
+ end
346
+ if excludeTransition.nil?
347
+ raise Exception.new("Couldn't identify final state of the precedence rule prefix section.")
348
+ end
349
+ else
350
+ endState = atn.ruleToStopState[idx]
351
+ end
352
+
353
+ # all non-excluded transitions that currently target end state need to target blockEnd instead
354
+ for state in atn.states
355
+ for transition in state.transitions
356
+ if transition == excludeTransition
357
+ next
358
+ end
359
+ if transition.target == endState
360
+ transition.target = bypassStop
361
+ end
362
+ end
363
+ end
364
+ # all transitions leaving the rule start state need to leave blockStart instead
365
+ ruleToStartState = atn.ruleToStartState[idx]
366
+ count = ruleToStartState.transitions.length()
367
+ 0.upto(ruleToStartState.transitions.length() -1) do |i|
368
+ transition = ruleToStartState.removeTransition(i)
369
+ bypassStart.addTransition(transition)
370
+ end
371
+ # link the new states
372
+ atn.ruleToStartState[idx].addTransition(EpsilonTransition.new(bypassStart))
373
+ bypassStop.addTransition(EpsilonTransition.new(endState))
374
+
375
+ matchState = BasicState.new()
376
+ atn.addState(matchState)
377
+ matchState.addTransition(AtomTransition.new(bypassStop, atn.ruleToTokenType[idx]))
378
+ bypassStart.addTransition(EpsilonTransition.new(matchState))
379
+ end
380
+
381
+ def stateIsEndStateFor(state, idx)
382
+ return nil if state.ruleIndex != idx
383
+ return nil if not state.kind_of? StarLoopEntryState
384
+
385
+ maybeLoopEndState = state.transitions[-1].target
386
+ return nil if not maybeLoopEndState.kind_of? LoopEndState
387
+
388
+ if maybeLoopEndState.epsilonOnlyTransitions and maybeLoopEndState.transitions[0].target.kind_of? RuleStopState
389
+ return state
390
+ else
391
+ return nil
392
+ end
393
+ end
394
+
395
+ #
396
+ # Analyze the {@link StarLoopEntryState} states in the specified ATN to set
397
+ # the {@link StarLoopEntryState#precedenceRuleDecision} field to the
398
+ # correct value.
399
+ #
400
+ # @param atn The ATN.
401
+ #
402
+ def markPrecedenceDecisions(atn)
403
+ for state in atn.states do
404
+ next if not state.kind_of? StarLoopEntryState
405
+
406
+ # We analyze the ATN to determine if this ATN decision state is the
407
+ # decision for the closure block that determines whether a
408
+ # precedence rule should continue or complete.
409
+ #
410
+ if atn.ruleToStartState[state.ruleIndex].isPrecedenceRule
411
+ maybeLoopEndState = state.transitions[-1].target
412
+ if maybeLoopEndState.kind_of? LoopEndState
413
+ if maybeLoopEndState.epsilonOnlyTransitions and \
414
+ maybeLoopEndState.transitions[0].target.kind_of? RuleStopState
415
+ state.precedenceRuleDecision = true
416
+ end
417
+ end
418
+ end
419
+ end
420
+ end
421
+
422
+ def verifyATN(atn)
423
+ return if not self.deserializationOptions.verifyATN
424
+ # verify assumptions
425
+ for state in atn.states do
426
+ next if state.nil?
427
+ self.checkCondition((state.epsilonOnlyTransitions or state.transitions.length <= 1))
428
+ if state.kind_of? PlusBlockStartState then
429
+ self.checkCondition( !state.loopBackState.nil?)
430
+
431
+ if state.kind_of? StarLoopEntryState then
432
+ self.checkCondition( !state.loopBackState.nil? )
433
+ self.checkCondition(state.transitions.length() == 2)
434
+
435
+ if state.transitions[0].target.kind_of? StarBlockStartState then
436
+ self.checkCondition(state.transitions[1].target.kind_of?(LoopEndState))
437
+ self.checkCondition(!state.nonGreedy)
438
+ elsif state.transitions[0].target.kind_of? LoopEndState then
439
+ self.checkCondition(state.transitions[1].target.kind_of?(StarBlockStartState))
440
+ self.checkCondition(state.nonGreedy)
441
+ else
442
+ raise Exception.new("IllegalState")
443
+ end
444
+ end
445
+ if state.kind_of? StarLoopbackState then
446
+ self.checkCondition(state.transitions.length() == 1)
447
+ self.checkCondition(state.transitions[0].target.kind_of?(StarLoopEntryState))
448
+ end
449
+ if state.kind_of? LoopEndState then
450
+ self.checkCondition(! state.loopBackState.nil?)
451
+ end
452
+
453
+ if state.kind_of? RuleStartState then
454
+ self.checkCondition( !state.stopState.nil? )
455
+ end
456
+
457
+ if state.kind_of? BlockStartState then
458
+ self.checkCondition(!state.endState.nil? )
459
+ end
460
+
461
+ if state.kind_of? BlockEndState then
462
+ self.checkCondition(!state.startState.nil? )
463
+ end
464
+
465
+ if state.kind_of? DecisionState then
466
+ self.checkCondition( (( state.transitions.length() <= 1) || ( state.decision >= 0)))
467
+ else
468
+ self.checkCondition(((state.transitions.lenth() <= 1) || (state.kind_of?(RuleStopState) )))
469
+ end
470
+ end
471
+ end
472
+ end
473
+ def checkCondition(condition, message=nil)
474
+ unless condition then
475
+ if message.nil?
476
+ message = "IllegalState"
477
+ end
478
+ raise Exception.new(message)
479
+ end
480
+ end
481
+ def readByte()
482
+ i = @data[self.pos]
483
+ begin
484
+ ii = i.ord
485
+ rescue
486
+ puts "#{i.class} #{i} #{i.encoding}"
487
+ end
488
+ @pos = @pos + 1
489
+ return ii
490
+ end
491
+ def readInt()
492
+ high = readByte()
493
+ low = readByte()
494
+ return (low | (high << 8)) - 2
495
+ end
496
+
497
+ def readInt32()
498
+ low = self.readInt()
499
+ high = self.readInt()
500
+ return low | (high << 16)
501
+ end
502
+ def readLong()
503
+ low = self.readInt32()
504
+ high = self.readInt32()
505
+ return (low & 0x00000000FFFFFFFF) | (high << 32)
506
+ end
507
+
508
+ def readUUID()
509
+ low = self.readLong()
510
+ high = self.readLong()
511
+ allBits = (low & 0xFFFFFFFFFFFFFFFF) | (high << 64)
512
+ return UUID.create_from_bytes(allBits)
513
+ end
514
+
515
+ def edgeFactory(atn, type, src, trg, arg1, arg2, arg3, sets)
516
+ target = atn.states[trg]
517
+ if self.edgeFactories.nil? then
518
+ ef = Array.new(11) # [nil] * 11
519
+ ef[0] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target| raise Exception.new("The specified state type 0 is not valid.") }
520
+ ef[Transition::EPSILON] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target| EpsilonTransition.new(target) }
521
+ ef[Transition::RANGE] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target|
522
+ if arg3 != 0
523
+ RangeTransition.new(target, Token::EOF, arg2)
524
+ else
525
+ RangeTransition.new(target, arg1, arg2)
526
+ end
527
+ }
528
+ ef[Transition::RULE] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target |
529
+ RuleTransition.new(atn.states[arg1], arg2, arg3, target) }
530
+ ef[Transition::PREDICATE] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target |
531
+ PredicateTransition.new(target, arg1, arg2, arg3 != 0) }
532
+ ef[Transition::PRECEDENCE] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target |
533
+ PrecedencePredicateTransition.new(target, arg1) }
534
+ ef[Transition::ATOM] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target |
535
+ if arg3 != 0
536
+ AtomTransition.new(target, Token::EOF)
537
+ else
538
+ AtomTransition.new(target, arg1)
539
+ end
540
+ }
541
+ ef[Transition::ACTION] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target |
542
+ ActionTransition.new(target, arg1, arg2, arg3 != 0) }
543
+ ef[Transition::SET] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target|
544
+ SetTransition.new(target, sets[arg1]) }
545
+ ef[Transition::NOT_SET] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target |
546
+ NotSetTransition.new(target, sets[arg1]) }
547
+ ef[Transition::WILDCARD] = lambda {|atn, src, trg, arg1, arg2, arg3, sets, target |
548
+ WildcardTransition.new(target) }
549
+ self.edgeFactories = ef
550
+ end
551
+ if type > self.edgeFactories.length() or self.edgeFactories[type].nil? then
552
+ raise Exception.new("The specified transition type: #{type} is not valid.")
553
+ else
554
+ return self.edgeFactories[type].call(atn, src, trg, arg1, arg2, arg3, sets, target)
555
+ end
556
+ end
557
+ def stateFactory(type, ruleIndex)
558
+ if self.stateFactories.nil?
559
+ sf = Array.new(13) # [nil] * 13
560
+ sf[ATNState::INVALID_TYPE] = lambda { nil }
561
+ sf[ATNState::BASIC] = lambda { BasicState.new }
562
+ sf[ATNState::RULE_START] = lambda { RuleStartState.new }
563
+ sf[ATNState::BLOCK_START] = lambda { BasicBlockStartState.new }
564
+ sf[ATNState::PLUS_BLOCK_START] = lambda { PlusBlockStartState.new }
565
+ sf[ATNState::STAR_BLOCK_START] = lambda { StarBlockStartState.new }
566
+ sf[ATNState::TOKEN_START] = lambda { TokensStartState.new }
567
+ sf[ATNState::RULE_STOP] = lambda { RuleStopState.new }
568
+ sf[ATNState::BLOCK_END] = lambda { BlockEndState.new }
569
+ sf[ATNState::STAR_LOOP_BACK] = lambda { StarLoopbackState.new }
570
+ sf[ATNState::STAR_LOOP_ENTRY] = lambda { StarLoopEntryState.new }
571
+ sf[ATNState::PLUS_LOOP_BACK] = lambda { PlusLoopbackState.new }
572
+ sf[ATNState::LOOP_END] = lambda { LoopEndState.new }
573
+ self.stateFactories = sf
574
+ end
575
+ if type> self.stateFactories.length() or self.stateFactories[type].nil?
576
+ raise Exceptionn.new("The specified state type #{type} is not valid.")
577
+ else
578
+ s = self.stateFactories[type].call()
579
+ if s
580
+ s.ruleIndex = ruleIndex
581
+ end
582
+ end
583
+ return s
584
+ end
585
+ def lexerActionFactory(type, data1, data2)
586
+ if self.actionFactories.nil? then
587
+ af = Array.new(8) #[ nil ] * 8
588
+ af[LexerActionType::CHANNEL] = lambda {|data1, data2| LexerChannelAction.new(data1) }
589
+ af[LexerActionType::CUSTOM] = lambda {|data1, data2| LexerCustomAction.new(data1, data2) }
590
+ af[LexerActionType::MODE] = lambda {|data1, data2| LexerModeAction.new(data1) }
591
+ af[LexerActionType::MORE] = lambda {|data1, data2| LexerMoreAction.INSTANCE }
592
+ af[LexerActionType::POP_MODE] = lambda {|data1, data2| LexerPopModeAction.INSTANCE }
593
+ af[LexerActionType::PUSH_MODE] = lambda {|data1, data2| LexerPushModeAction.new(data1) }
594
+ af[LexerActionType::SKIP] = lambda {|data1, data2| LexerSkipAction.INSTANCE }
595
+ af[LexerActionType::TYPE] = lambda {|data1, data2| LexerTypeAction.new(data1) }
596
+ self.actionFactories = af
597
+ end
598
+ if type> self.actionFactories.length() or self.actionFactories[type].nil?
599
+ raise Exception("The specified lexer action type #{type} is not valid.")
600
+ else
601
+ return self.actionFactories[type].call(data1, data2)
602
+ end
603
+ end
604
+ end