antlr3 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/ANTLR-LICENSE.txt +26 -0
  2. data/History.txt +66 -0
  3. data/README.txt +139 -0
  4. data/bin/antlr4ruby +33 -0
  5. data/java/RubyTarget.java +524 -0
  6. data/java/antlr-full-3.2.1.jar +0 -0
  7. data/lib/antlr3.rb +176 -0
  8. data/lib/antlr3/constants.rb +88 -0
  9. data/lib/antlr3/debug.rb +701 -0
  10. data/lib/antlr3/debug/event-hub.rb +210 -0
  11. data/lib/antlr3/debug/record-event-listener.rb +25 -0
  12. data/lib/antlr3/debug/rule-tracer.rb +55 -0
  13. data/lib/antlr3/debug/socket.rb +360 -0
  14. data/lib/antlr3/debug/trace-event-listener.rb +92 -0
  15. data/lib/antlr3/dfa.rb +247 -0
  16. data/lib/antlr3/dot.rb +174 -0
  17. data/lib/antlr3/error.rb +657 -0
  18. data/lib/antlr3/main.rb +561 -0
  19. data/lib/antlr3/modes/ast-builder.rb +41 -0
  20. data/lib/antlr3/modes/filter.rb +56 -0
  21. data/lib/antlr3/profile.rb +322 -0
  22. data/lib/antlr3/recognizers.rb +1280 -0
  23. data/lib/antlr3/streams.rb +985 -0
  24. data/lib/antlr3/streams/interactive.rb +91 -0
  25. data/lib/antlr3/streams/rewrite.rb +412 -0
  26. data/lib/antlr3/test/call-stack.rb +57 -0
  27. data/lib/antlr3/test/config.rb +23 -0
  28. data/lib/antlr3/test/core-extensions.rb +269 -0
  29. data/lib/antlr3/test/diff.rb +165 -0
  30. data/lib/antlr3/test/functional.rb +207 -0
  31. data/lib/antlr3/test/grammar.rb +371 -0
  32. data/lib/antlr3/token.rb +592 -0
  33. data/lib/antlr3/tree.rb +1415 -0
  34. data/lib/antlr3/tree/debug.rb +163 -0
  35. data/lib/antlr3/tree/visitor.rb +84 -0
  36. data/lib/antlr3/tree/wizard.rb +481 -0
  37. data/lib/antlr3/util.rb +149 -0
  38. data/lib/antlr3/version.rb +27 -0
  39. data/samples/ANTLRv3Grammar.g +621 -0
  40. data/samples/Cpp.g +749 -0
  41. data/templates/AST.stg +335 -0
  42. data/templates/ASTDbg.stg +40 -0
  43. data/templates/ASTParser.stg +153 -0
  44. data/templates/ASTTreeParser.stg +272 -0
  45. data/templates/Dbg.stg +192 -0
  46. data/templates/Ruby.stg +1514 -0
  47. data/test/functional/ast-output/auto-ast.rb +797 -0
  48. data/test/functional/ast-output/construction.rb +555 -0
  49. data/test/functional/ast-output/hetero-nodes.rb +753 -0
  50. data/test/functional/ast-output/rewrites.rb +1327 -0
  51. data/test/functional/ast-output/tree-rewrite.rb +1662 -0
  52. data/test/functional/debugging/debug-mode.rb +689 -0
  53. data/test/functional/debugging/profile-mode.rb +165 -0
  54. data/test/functional/debugging/rule-tracing.rb +74 -0
  55. data/test/functional/delegation/import.rb +379 -0
  56. data/test/functional/lexer/basic.rb +559 -0
  57. data/test/functional/lexer/filter-mode.rb +245 -0
  58. data/test/functional/lexer/nuances.rb +47 -0
  59. data/test/functional/lexer/properties.rb +104 -0
  60. data/test/functional/lexer/syn-pred.rb +32 -0
  61. data/test/functional/lexer/xml.rb +206 -0
  62. data/test/functional/main/main-scripts.rb +245 -0
  63. data/test/functional/parser/actions.rb +224 -0
  64. data/test/functional/parser/backtracking.rb +244 -0
  65. data/test/functional/parser/basic.rb +282 -0
  66. data/test/functional/parser/calc.rb +98 -0
  67. data/test/functional/parser/ll-star.rb +143 -0
  68. data/test/functional/parser/nuances.rb +165 -0
  69. data/test/functional/parser/predicates.rb +103 -0
  70. data/test/functional/parser/properties.rb +242 -0
  71. data/test/functional/parser/rule-methods.rb +132 -0
  72. data/test/functional/parser/scopes.rb +274 -0
  73. data/test/functional/token-rewrite/basic.rb +318 -0
  74. data/test/functional/token-rewrite/via-parser.rb +100 -0
  75. data/test/functional/tree-parser/basic.rb +750 -0
  76. data/test/unit/sample-input/file-stream-1 +2 -0
  77. data/test/unit/sample-input/teststreams.input2 +2 -0
  78. data/test/unit/test-dfa.rb +52 -0
  79. data/test/unit/test-exceptions.rb +44 -0
  80. data/test/unit/test-recognizers.rb +55 -0
  81. data/test/unit/test-scheme.rb +62 -0
  82. data/test/unit/test-streams.rb +459 -0
  83. data/test/unit/test-tree-wizard.rb +535 -0
  84. data/test/unit/test-trees.rb +854 -0
  85. metadata +205 -0
@@ -0,0 +1,657 @@
1
+ #!/usr/bin/ruby
2
+ # encoding: utf-8
3
+
4
+ =begin LICENSE
5
+
6
+ [The "BSD licence"]
7
+ Copyright (c) 2009 Kyle Yetter
8
+ All rights reserved.
9
+
10
+ Redistribution and use in source and binary forms, with or without
11
+ modification, are permitted provided that the following conditions
12
+ are met:
13
+
14
+ 1. Redistributions of source code must retain the above copyright
15
+ notice, this list of conditions and the following disclaimer.
16
+ 2. Redistributions in binary form must reproduce the above copyright
17
+ notice, this list of conditions and the following disclaimer in the
18
+ documentation and/or other materials provided with the distribution.
19
+ 3. The name of the author may not be used to endorse or promote products
20
+ derived from this software without specific prior written permission.
21
+
22
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+
33
+ =end
34
+
35
+ # ANTLR3 exception hierarchy
36
+ # - ported from the ANTLR3 Python Runtime library by
37
+ # Kyle Yetter (kcy5b@yahoo.com)
38
+ module ANTLR3
39
+ module Error
40
+
41
+ =begin rdoc ANTLR3::Error::BacktrackingFailed
42
+
43
+ error:: BacktrackingFailed
44
+ used by:: all recognizers
45
+ occurs when::
46
+ recognizer is in backtracking mode (i.e. r.state.backtracking > 0)
47
+ and the decision path the recognizer is currently attempting
48
+ hit a point of failure
49
+ notes::
50
+ - functions more as an internal signal, simillar to exception
51
+ classes such as StopIteration and SystemExit
52
+ - used to inform the recognizer that it needs to rewind
53
+ the input to the point at which it started the decision
54
+ and then either try another possible decision path or
55
+ declare failure
56
+ - not a subclass of RecognitionError
57
+
58
+ =end
59
+
60
+ class BacktrackingFailed < StandardError; end
61
+
62
+ # To avoid English-only error messages and to generally make things
63
+ # as flexible as possible, these exceptions are not created with strings,
64
+ # but rather the information necessary to generate an error. Then
65
+ # the various reporting methods in Parser and Lexer can be overridden
66
+ # to generate a localized error message. For example, MismatchedToken
67
+ # exceptions are built with the expected token type.
68
+ # So, don't expect getMessage() to return anything.
69
+ #
70
+ # Note that as of Java 1.4, you can access the stack trace, which means
71
+ # that you can compute the complete trace of rules from the start symbol.
72
+ # This gives you considerable context information with which to generate
73
+ # useful error messages.
74
+ #
75
+ # ANTLR generates code that throws exceptions upon recognition error and
76
+ # also generates code to catch these exceptions in each rule. If you
77
+ # want to quit upon first error, you can turn off the automatic error
78
+ # handling mechanism using rulecatch action, but you still need to
79
+ # override methods mismatch and recoverFromMismatchSet.
80
+ #
81
+ # In general, the recognition exceptions can track where in a grammar a
82
+ # problem occurred and/or what was the expected input. While the parser
83
+ # knows its state (such as current input symbol and line info) that
84
+ # state can change before the exception is reported so current token index
85
+ # is computed and stored at exception time. From this info, you can
86
+ # perhaps print an entire line of input not just a single token, for example.
87
+ # Better to just say the recognizer had a problem and then let the parser
88
+ # figure out a fancy report.
89
+
90
+ =begin rdoc ANTLR3::Error::RecognitionError
91
+
92
+ The base class of the variety of syntax errors that can occur during the
93
+ recognition process. These errors all typically concern an expectation built in
94
+ to the recognizer by the rules of a grammar and an input symbol which failed to
95
+ fit the expectation.
96
+
97
+ =end
98
+
99
+ class RecognitionError < StandardError
100
+ include ANTLR3::Constants
101
+ attr_accessor :input, :index, :line, :column, :symbol, :token, :source_name
102
+
103
+ def initialize(input = nil)
104
+ @index = @line = @column = nil
105
+ @approximate_line_info = false
106
+ if @input = input
107
+ @index = input.index
108
+ @source_name = @input.source_name rescue nil
109
+ case @input
110
+ when TokenStream
111
+ @token = @symbol = input.look
112
+ @line = @symbol.line
113
+ @column = @symbol.column
114
+ when CharacterStream
115
+ @token = @symbol = input.peek || EOF
116
+ @line = @input.line
117
+ @column = @input.column
118
+ when AST::TreeNodeStream
119
+ @symbol = nodes.look
120
+ if @symbol.respond_to?(:line) and @symbol.respond_to?(:column)
121
+ @line, @column = @symbol.line, @symbol.column
122
+ else
123
+ extract_from_node_stream(@input)
124
+ end
125
+ else
126
+ @symbol = @input.look
127
+ if @symbol.respond_to?(:line) and @symbol.respond_to?(:column)
128
+ @line, @column = @symbol.line, @symbol.column
129
+ elsif @input.respond_to?(:line) and @input.respond_to?(:column)
130
+ @line, @column = @input.line, @input.column
131
+ end
132
+ end
133
+ end
134
+ super(message)
135
+ end
136
+
137
+ def approximate_line_info?
138
+ @approximate_line_info
139
+ end
140
+
141
+ def unexpected_type
142
+ case @input
143
+ when TokenStream
144
+ @symbol.type
145
+ when AST::TreeNodeStream
146
+ adaptor = @input.adaptor
147
+ return adaptor.type(@symbol)
148
+ else
149
+ return @symbol
150
+ end
151
+ end
152
+
153
+ def location
154
+ if @source_name then "in #@source_name @ line #@line:#@column"
155
+ else "line #@line:#@column"
156
+ end
157
+ end
158
+
159
+ alias inspect message
160
+
161
+ private
162
+
163
+ def extract_from_node_stream(nodes)
164
+ adaptor = nodes.adaptor
165
+ payload = adaptor.token(@symbol)
166
+
167
+ if payload
168
+ @token = payload
169
+ if payload.line <= 0
170
+ i = -1
171
+ while prior_node = nodes.look(i)
172
+ prior_payload = adaptor.token(prior_node)
173
+ if prior_payload and prior_payload.line > 0
174
+ @line = prior_payload.line
175
+ @column = prior_payload.column
176
+ @approximate_line_info = true
177
+ break
178
+ end
179
+ i -= 1
180
+ end
181
+ else
182
+ @line = payload.line
183
+ @column = payload.column
184
+ end
185
+ elsif @symbol.is_a?(AST::Tree)
186
+ @line = @symbol.line
187
+ @column = @symbol.column
188
+ @symbol.is_a?(AST::CommonTree) and @token = @symbol.token
189
+ else
190
+ type = adaptor.type( @symbol )
191
+ text = adaptor.text( @symbol )
192
+ token_class = @input.token_class rescue CommonToken
193
+ @token = token_class.new
194
+ @token.type = type
195
+ @token.text = text
196
+ @token
197
+ end
198
+ end
199
+ end
200
+
201
+ =begin rdoc ANTLR3::Error::MismatchedToken
202
+
203
+ type:: MismatchedToken
204
+ used by:: lexers and parsers
205
+ occurs when::
206
+ The recognizer expected to match a symbol <tt>x</tt> at the current input
207
+ position, but it saw a different symbol <tt>y</tt> instead.
208
+
209
+ =end
210
+
211
+ class MismatchedToken < RecognitionError
212
+ attr_reader :expecting
213
+ def initialize(expecting, input)
214
+ @expecting = expecting
215
+ super(input)
216
+ end
217
+
218
+ def message
219
+ "%s: %p %p" % [self.class, unexpected_type, @expecting.inspect]
220
+ end
221
+ end
222
+
223
+ =begin rdoc ANTLR3::Error::UnwantedToken
224
+
225
+ TODO: this does not appear to be used by any code
226
+
227
+ =end
228
+
229
+ class UnwantedToken < MismatchedToken
230
+ def unexpected_token
231
+ return @token
232
+ end
233
+
234
+ def message
235
+ exp = @expecting == INVALID_TOKEN_TYPE ? '' : ", expected %p" % @expecting
236
+ text = @symbol.text rescue nil
237
+ "%s: found=%p%s" % [self.class, text, exp]
238
+ end
239
+ end
240
+
241
+ =begin rdoc ANTLR3::Error::MissingToken
242
+
243
+ error:: MissingToken
244
+ used by:: parsers and tree parsers
245
+ occurs when::
246
+ The recognizer expected to match some symbol, but it sees a different symbol.
247
+ The symbol it sees is actually what the recognizer expected to match next.
248
+
249
+ === Example
250
+
251
+ grammar:
252
+
253
+ grammar MissingTokenExample;
254
+
255
+ options { language = Ruby; }
256
+
257
+ @members {
258
+ def report_error(e)
259
+ raise e
260
+ end
261
+ }
262
+
263
+ missing: A B C;
264
+
265
+ A: 'a';
266
+ B: 'b';
267
+ C: 'c';
268
+
269
+ in ruby:
270
+
271
+ require 'MissingTokenExampleLexer'
272
+ require 'MissingTokenExampleParser'
273
+
274
+ lexer = MissingTokenExample::Lexer.new( "ac" ) # <= notice the missing 'b'
275
+ tokens = ANTLR3::CommonTokenStream.new( lexer )
276
+ parser = MissingTokenExample::Parser.new( tokens )
277
+
278
+ parser.missing
279
+ # raises ANTLR3::Error::MissingToken: at "c"
280
+
281
+ =end
282
+
283
+ class MissingToken < MismatchedToken
284
+ attr_accessor :inserted
285
+ def initialize(expecting, input, inserted)
286
+ super(expecting, input)
287
+ @inserted = inserted
288
+ end
289
+
290
+ def missing_type
291
+ return @expecting
292
+ end
293
+
294
+ def message
295
+ if @inserted and @symbol
296
+ "%s: inserted %p at %p" %
297
+ [self.class, @inserted, @symbol.text]
298
+ else
299
+ msg = self.class.to_s
300
+ msg << ': at %p' % token.text unless @token.nil?
301
+ return msg
302
+ end
303
+ end
304
+ end
305
+
306
+ =begin rdoc ANTLR3::Error::MismatchedRange
307
+
308
+ error:: MismatchedRange
309
+ used by:: all recognizers
310
+ occurs when::
311
+ A recognizer expected to match an input symbol (either a character value or
312
+ an integer token type value) that falls into a range of possible values, but
313
+ instead it saw a symbol that falls outside the expected range.
314
+
315
+ =end
316
+
317
+ class MismatchedRange < RecognitionError
318
+ attr_accessor :min, :max
319
+ def initialize(min, max, input)
320
+ @min = min
321
+ @max = max
322
+ super(input)
323
+ end
324
+
325
+ def message
326
+ "%s: %p not in %p..%p" %
327
+ [self.class, unexpected_type, @min, @max]
328
+ end
329
+ end
330
+
331
+ =begin rdoc ANTLR3::Error::MismatchedSet
332
+
333
+ error:: MismatchedSet
334
+ used by:: all recognizers
335
+ occurs when::
336
+ A recognizer expects the current input symbol to be a member of a set of
337
+ possible symbol values, but the current symbol does not match.
338
+
339
+ =end
340
+
341
+ class MismatchedSet < RecognitionError
342
+ attr_accessor :expecting
343
+ def initialize(expecting, input)
344
+ super(input)
345
+ @expecting = expecting
346
+ end
347
+
348
+ def message
349
+ "%s: %p not in %p" %
350
+ [self.class, unexpected_type, @expecting]
351
+ end
352
+ end
353
+
354
+ =begin rdoc ANTLR3::Error::MismatchedNotSet
355
+
356
+ error:: MismatchedNotSet
357
+ used by:: all recognizers
358
+ occurs when::
359
+ A recognizer expected to match symbol that is not in some set of symbols but
360
+ failed.
361
+
362
+ =end
363
+
364
+ class MismatchedNotSet < MismatchedSet
365
+ def message
366
+ '%s: %p != %p' %
367
+ [self.class, unexpected_type, @expecting]
368
+ end
369
+ end
370
+
371
+ =begin rdoc ANTLR3::Error::NoViableAlternative
372
+
373
+ error:: NoViableAlternative
374
+ used by:: all recognizers
375
+ occurs when::
376
+ A recognizer must choose between multiple possible recognition paths based
377
+ upon the current and future input symbols, but it has determined that
378
+ the input does not suit any of the possible recognition alternatives.
379
+
380
+ In ANTLR terminology, a rule is composed of one or more _alternatives_,
381
+ specifications seperated by <tt>|</tt> characters. An alternative is composed of
382
+ a series of elements, including _subrules_ -- rule specifications enclosed
383
+ within parentheses. When recognition code enters a rule method (or a subrule
384
+ block) that has multiple alternatives, the recognizer must decide which one of
385
+ the multiple possible paths to follow by checking a number of future input
386
+ symbols. Thus, NoViableAlternative errors indicate that the current input does
387
+ not fit any of the possible paths.
388
+
389
+ In lexers, this error is often raised by the main +tokens!+ rule, which must
390
+ choose between all possible token rules. If raised by +tokens+, it means the
391
+ current input does not appear to be part of any token specification.
392
+
393
+ =end
394
+
395
+ class NoViableAlternative < RecognitionError
396
+ attr_accessor :grammar_decision_description, :decision_number, :state_number
397
+ def initialize(grammar_decision_description, decision_number, state_number, input)
398
+ @grammar_decision_description = grammar_decision_description
399
+ @decision_number = decision_number
400
+ @state_number = state_number
401
+ super(input)
402
+ end
403
+
404
+ def message
405
+ '%s: %p != [%p]' %
406
+ [self.class, unexpected_type, @grammar_decision_description]
407
+ end
408
+ end
409
+
410
+ =begin rdoc ANTLR3::Error::EarlyExit
411
+
412
+ error:: EarlyExit
413
+ used by:: all recognizers
414
+ occurs when::
415
+ The recognizer is in a <tt>(..)+</tt> subrule, meaning the recognizer must
416
+ match the body of the subrule one or more times. If it fails to match at least
417
+ one occurence of the subrule, the recognizer will raise an EarlyExit
418
+ exception.
419
+
420
+ == Example
421
+
422
+ consider a grammar like:
423
+ lexer grammar EarlyExitDemo;
424
+ ...
425
+ ID: 'a'..'z' ('0'..'9')+;
426
+
427
+ now in ruby
428
+
429
+ require 'EarlyExitDemo'
430
+
431
+ input = ANTLR3::StringStream.new( "ab" )
432
+ lexer = EarlyExitDemo::Lexer.new( input )
433
+ lexer.next_token
434
+ # -> raises EarlyExit: line 1:1 required (...)+ loop did not match
435
+ # anything at character "b"
436
+
437
+ =end
438
+
439
+ class EarlyExit < RecognitionError
440
+ attr_accessor :decision_number
441
+ def initialize(decision_number, input)
442
+ @decision_number = decision_number
443
+ super(input)
444
+ end
445
+ def message
446
+ "The recognizer did not match anything for a (..)+ loop."
447
+ end
448
+ end
449
+
450
+ =begin rdoc ANTLR3::Error::FailedPredicate
451
+
452
+ error:: FailedPredicate
453
+ used by:: all recognizers
454
+ occurs when::
455
+ A recognizer is in a rule with a predicate action element, and the predicating
456
+ action code evaluated to a +false+ value.
457
+
458
+ =end
459
+
460
+ class FailedPredicate < RecognitionError
461
+ attr_accessor :input, :rule_name, :predicate_text
462
+ def initialize(input, rule_name, predicate_text)
463
+ @rule_name = rule_name
464
+ @predicate_text = predicate_text
465
+ super(input)
466
+ end
467
+
468
+ def message
469
+ '%s(%s, { %s }?)' % [self.class.name, @rule_name, @predicate_text]
470
+ end
471
+ end
472
+
473
+ =begin rdoc ANTLR3::Error::MismatchedTreeNode
474
+
475
+ error:: MismatchedTreeNode
476
+ used by:: tree parsers
477
+ occurs when::
478
+ A tree parser expects to match a tree node containing a specific type of
479
+ token, but the current tree node's token type does not match. It's essentially
480
+ the same as MismatchedToken, but used specifically for tree nodes.
481
+
482
+ =end
483
+
484
+ class MismatchedTreeNode < RecognitionError
485
+ attr_accessor :expecting, :input
486
+ def initialize(expecting, input)
487
+ @expecting = expecting
488
+ super(input)
489
+ end
490
+
491
+ def message
492
+ '%s: %p != %p' %
493
+ [self.class, unexpected_type, @expecting]
494
+ end
495
+ end
496
+
497
+ =begin rdoc ANTLR3::Error::RewriteCardinalityError
498
+
499
+ error:: RewriteCardinalityError
500
+ used by:: tree-rewriting parsers and tree parsers
501
+ occurs when::
502
+ There is an inconsistency between the number of appearances of some symbol
503
+ on the left side of a rewrite rule and the number of the same symbol
504
+ seen on the right side of a rewrite rule
505
+
506
+ =end
507
+
508
+ class RewriteCardinalityError < StandardError
509
+ attr_accessor :element_description
510
+ def initialize(element_description)
511
+ @element_description = element_description
512
+ super(message)
513
+ end
514
+
515
+ def message
516
+ "%s: %s" % [self.class, @element_description]
517
+ end
518
+ end
519
+
520
+ =begin rdoc ANTLR3::Error::RewriteEarlyExit
521
+
522
+ error:: RewriteEarlyExit
523
+ used by:: tree-rewriting parsers and tree parsers
524
+ occurs when::
525
+ A tree-rewrite rule requires one or more occurence of a symbol, but none
526
+ have been seen.
527
+
528
+ =end
529
+
530
+ class RewriteEarlyExit < RewriteCardinalityError
531
+ attr_accessor :element_description
532
+ def initialize(element_description = nil)
533
+ super(element_description)
534
+ end
535
+ end
536
+
537
+ =begin rdoc ANTLR3::Error::RewriteEmptyStream
538
+
539
+ error:: RewriteEmptyStream
540
+ used by:: tree-rewriting parsers and tree parsers
541
+
542
+ =end
543
+
544
+ class RewriteEmptyStream < RewriteCardinalityError; end
545
+
546
+ =begin rdoc ANTLR3::Error::TreeInconsistency
547
+
548
+ error:: TreeInconsistency
549
+ used by:: classes that deal with tree structures
550
+ occurs when::
551
+ A tree node's data is inconsistent with the overall structure to which it
552
+ belongs.
553
+
554
+ situations that result in tree inconsistencies:
555
+
556
+ 1. A node has a child node with a +@parent+ attribute different than the node.
557
+ 2. A node has a child at index +n+, but the child's +@child_index+ value is not
558
+ +n+
559
+ 3. An adaptor encountered a situation where multiple tree nodes have been
560
+ simultaneously requested as a new tree root.
561
+
562
+ =end
563
+
564
+ class TreeInconsistency < StandardError
565
+ def self.failed_index_check!(expected, real)
566
+ new(
567
+ "%s: child indexes don't match -> expected %d found %d" %
568
+ [self, expected, real]
569
+ )
570
+ end
571
+
572
+ def self.failed_parent_check!(expected, real)
573
+ new(
574
+ "%s: parents don't match; expected %p found %p" %
575
+ [self, expected, real]
576
+ )
577
+ end
578
+
579
+ def self.multiple_roots!
580
+ new "%s: attempted to change more than one node to root" % self
581
+ end
582
+ end
583
+
584
+ module_function
585
+
586
+ def MismatchedToken(expecting, input = @input)
587
+ MismatchedToken.new(expecting, input)
588
+ end
589
+
590
+ def UnwantedToken(expecting, input = @input)
591
+ UnwantedToken.new(expecting, input)
592
+ end
593
+
594
+ def MissingToken(expecting, inserted, input = @input)
595
+ MissingToken.new(expecting, input, inserted)
596
+ end
597
+
598
+ def MismatchedRange(min, max, input = @input)
599
+ MismatchedRange.new(min, max, input)
600
+ end
601
+
602
+ def MismatchedSet(expecting, input = @input)
603
+ MismatchedSet.new(expecting, input)
604
+ end
605
+
606
+ def MismatchedNotSet(expecting, input = @input)
607
+ MismatchedNotSet.new(expecting, input)
608
+ end
609
+
610
+ def NoViableAlternative(description, decision_number, state_number, input = @input)
611
+ NoViableAlternative.new(description, decision_number, state_number, input)
612
+ end
613
+
614
+ def EarlyExit(decision_number, input = @input)
615
+ EarlyExit.new(decision_number, input)
616
+ end
617
+
618
+ def FailedPredicate(rule_name, predicate_text, input = @input)
619
+ FailedPredicate.new(input, rule_name, predicate_text)
620
+ end
621
+
622
+ def MismatchedTreeNode(expecting, input = @input)
623
+ MismatchedTreeNode.new(expecting, input)
624
+ end
625
+
626
+ def RewriteCardinalityError(element_description)
627
+ RewriteCardinalityError.new(element_description)
628
+ end
629
+
630
+ def RewriteEarlyExit(element_description = nil)
631
+ RewriteEarlyExit.new(element_description)
632
+ end
633
+
634
+ def RewriteEmptyStream(element_description)
635
+ RewriteEmptyStream.new(element_description)
636
+ end
637
+
638
+ end
639
+
640
+ include Error
641
+
642
+ =begin rdoc ANTLR3::Bug
643
+
644
+
645
+
646
+ =end
647
+
648
+ class Bug < StandardError
649
+ def initialize(message = nil, *args)
650
+ message = "something occurred that should not occur within unmodified, " <<
651
+ "ANTLR-generated source code: #{message}"
652
+ super(message, *args)
653
+ end
654
+ end
655
+
656
+ end
657
+