1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin LICENSE
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[The "BSD licence"]
7324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCopyright (c) 2009-2010 Kyle Yetter
8324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAll rights reserved.
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
10324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRedistribution and use in source and binary forms, with or without
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodification, are permitted provided that the following conditions
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverare met:
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1. Redistributions of source code must retain the above copyright
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2. Redistributions in binary form must reproduce the above copyright
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer in the
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    documentation and/or other materials provided with the distribution.
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3. The name of the author may not be used to endorse or promote products
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    derived from this software without specific prior written permission.
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
22324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ANTLR3 exception hierarchy
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# - ported from the ANTLR3 Python Runtime library by
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#   Kyle Yetter (kcy5b@yahoo.com)
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule ANTLR3
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# for compatibility with rubinius, which does not implement StopIteration yet
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverunless defined?( StopIteration )
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StopIteration = Class.new( StandardError )
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule Error
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::BacktrackingFailed
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: BacktrackingFailed
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: all recognizers
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  recognizer is in backtracking mode (i.e. r.state.backtracking > 0)
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  and the decision path the recognizer is currently attempting
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  hit a point of failure
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernotes::
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  - functions more as an internal signal, simillar to exception
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    classes such as StopIteration and SystemExit
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  - used to inform the recognizer that it needs to rewind
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    the input to the point at which it started the decision
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    and then either try another possible decision path or
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    declare failure
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  - not a subclass of RecognitionError
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass BacktrackingFailed < StandardError; end
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # To avoid English-only error messages and to generally make things
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # as flexible as possible, these exceptions are not created with strings,
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # but rather the information necessary to generate an error.  Then
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # the various reporting methods in Parser and Lexer can be overridden
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # to generate a localized error message.  For example, MismatchedToken
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # exceptions are built with the expected token type.
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # So, don't expect getMessage() to return anything.
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  #
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # Note that as of Java 1.4, you can access the stack trace, which means
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # that you can compute the complete trace of rules from the start symbol.
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # This gives you considerable context information with which to generate
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # useful error messages.
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  #
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # ANTLR generates code that throws exceptions upon recognition error and
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # also generates code to catch these exceptions in each rule.  If you
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # want to quit upon first error, you can turn off the automatic error
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # handling mechanism using rulecatch action, but you still need to
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # override methods mismatch and recoverFromMismatchSet.
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  #
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # In general, the recognition exceptions can track where in a grammar a
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # problem occurred and/or what was the expected input.  While the parser
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # knows its state (such as current input symbol and line info) that
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # state can change before the exception is reported so current token index
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # is computed and stored at exception time.  From this info, you can
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # perhaps print an entire line of input not just a single token, for example.
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # Better to just say the recognizer had a problem and then let the parser
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # figure out a fancy report.
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::RecognitionError
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
98324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverThe base class of the variety of syntax errors that can occur during the
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrecognition process. These errors all typically concern an expectation built in
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverto the recognizer by the rules of a grammar and an input symbol which failed to
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfit the expectation.
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass RecognitionError < StandardError
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  include ANTLR3::Constants
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :input, :index, :line, :column, :symbol, :token, :source_name
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( input = nil )
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @index = @line =  @column = nil
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @approximate_line_info = false
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if @input = input
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @index = input.index
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @source_name = @input.source_name rescue nil
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      case @input
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      when TokenStream
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @token = @symbol = input.look
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @line   = @symbol.line
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @column = @symbol.column
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      when CharacterStream
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @token = @symbol = input.peek || EOF
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @line   = @input.line
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @column = @input.column
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      when AST::TreeNodeStream
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @symbol = @input.look
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if @symbol.respond_to?( :line ) and @symbol.respond_to?( :column )
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @line, @column = @symbol.line, @symbol.column
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          extract_from_node_stream( @input )
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @symbol = @input.look
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if @symbol.respond_to?( :line ) and @symbol.respond_to?( :column )
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @line, @column = @symbol.line, @symbol.column
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elsif @input.respond_to?( :line ) and @input.respond_to?( :column )
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @line, @column = @input.line, @input.column
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( message )
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def approximate_line_info?
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @approximate_line_info
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def unexpected_type
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    case @input
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    when TokenStream
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @symbol.type
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    when AST::TreeNodeStream
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      adaptor = @input.adaptor
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      return adaptor.type( @symbol )
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      return @symbol
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def location
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if @source_name then "in #@source_name @ line #@line:#@column"
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else "line #@line:#@column"
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  alias inspect message
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def extract_from_node_stream( nodes )
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    adaptor = nodes.adaptor
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    payload = adaptor.token( @symbol )
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if payload
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @token = payload
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if payload.line <= 0
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        i = -1
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        while prior_node = nodes.look( i )
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          prior_payload = adaptor.token( prior_node )
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          if prior_payload and prior_payload.line > 0
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @line = prior_payload.line
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @column = prior_payload.column
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @approximate_line_info = true
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            break
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          end
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          i -= 1
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @line = payload.line
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @column = payload.column
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    elsif @symbol.is_a?( AST::Tree )
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @line = @symbol.line
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @column = @symbol.column
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @symbol.is_a?( AST::CommonTree ) and @token = @symbol.token
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type = adaptor.type( @symbol )
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      text = adaptor.text( @symbol )
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      token_class = @input.token_class rescue CommonToken
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @token = token_class.new
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @token.type = type
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @token.text = text
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @token
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::MismatchedToken
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype:: MismatchedToken
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: lexers and parsers
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  The recognizer expected to match a symbol <tt>x</tt> at the current input
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  position, but it saw a different symbol <tt>y</tt> instead.
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MismatchedToken < RecognitionError
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_reader :expecting
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( expecting, input )
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @expecting = expecting
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( input )
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "%s: %p %p" % [ self.class, unexpected_type, @expecting.inspect ]
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::UnwantedToken
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
232324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTODO: this does not appear to be used by any code
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass UnwantedToken < MismatchedToken
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def unexpected_token
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return @token
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    exp = @expecting == INVALID_TOKEN_TYPE ? '' : ", expected %p" % @expecting
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text = @symbol.text rescue nil
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "%s: found=%p%s" % [ self.class, text, exp ]
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::MissingToken
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: MissingToken
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: parsers and tree parsers
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  The recognizer expected to match some symbol, but it sees a different symbol.
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  The symbol it sees is actually what the recognizer expected to match next.
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=== Example
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvergrammar:
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  grammar MissingTokenExample;
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  options { language = Ruby; }
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  @members {
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def report_error(e)
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      raise e
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  missing: A B C;
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  A: 'a';
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  B: 'b';
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C: 'c';
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverin ruby:
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  require 'MissingTokenExampleLexer'
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  require 'MissingTokenExampleParser'
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  lexer = MissingTokenExample::Lexer.new( "ac" )  # <= notice the missing 'b'
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  tokens = ANTLR3::CommonTokenStream.new( lexer )
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  parser = MissingTokenExample::Parser.new( tokens )
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  parser.missing
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # raises ANTLR3::Error::MissingToken: at "c"
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MissingToken < MismatchedToken
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :inserted
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( expecting, input, inserted )
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( expecting, input )
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @inserted = inserted
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def missing_type
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return @expecting
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if @inserted and @symbol
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      "%s: inserted %p at %p" %
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        [ self.class, @inserted, @symbol.text ]
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      msg = self.class.to_s
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      msg << ': at %p' % token.text unless @token.nil?
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      return msg
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::MismatchedRange
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: MismatchedRange
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: all recognizers 
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  A recognizer expected to match an input symbol (either a character value or
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  an integer token type value) that falls into a range of possible values, but
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  instead it saw a symbol that falls outside the expected range.
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MismatchedRange < RecognitionError
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :min, :max
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( min, max, input )
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @min = min
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @max = max
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( input )
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "%s: %p not in %p..%p" %
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ self.class, unexpected_type, @min, @max ]
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::MismatchedSet
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: MismatchedSet
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: all recognizers
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  A recognizer expects the current input symbol to be a member of a set of
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  possible symbol values, but the current symbol does not match.
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MismatchedSet < RecognitionError
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :expecting
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( expecting, input )
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( input )
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @expecting = expecting
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "%s: %p not in %p" %
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ self.class, unexpected_type, @expecting ]
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::MismatchedNotSet
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: MismatchedNotSet
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: all recognizers
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  A recognizer expected to match symbol that is not in some set of symbols but
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  failed.
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MismatchedNotSet < MismatchedSet
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    '%s: %p != %p' %
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ self.class, unexpected_type, @expecting ]
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::NoViableAlternative
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: NoViableAlternative
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: all recognizers
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  A recognizer must choose between multiple possible recognition paths based
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  upon the current and future input symbols, but it has determined that
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  the input does not suit any of the possible recognition alternatives.
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
387324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIn ANTLR terminology, a rule is composed of one or more _alternatives_,
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverspecifications seperated by <tt>|</tt> characters. An alternative is composed of
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvera series of elements, including _subrules_ -- rule specifications enclosed
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwithin parentheses. When recognition code enters a rule method (or a subrule
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverblock) that has multiple alternatives, the recognizer must decide which one of
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthe multiple possible paths to follow by checking a number of future input
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversymbols. Thus, NoViableAlternative errors indicate that the current input does
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernot fit any of the possible paths.
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
396324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIn lexers, this error is often raised by the main +tokens!+ rule, which must
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverchoose between all possible token rules. If raised by +tokens+, it means the
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercurrent input does not appear to be part of any token specification.
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass NoViableAlternative < RecognitionError
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :grammar_decision_description, :decision_number, :state_number
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( grammar_decision_description, decision_number, state_number, input )
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @grammar_decision_description = grammar_decision_description
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @decision_number = decision_number
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @state_number = state_number
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( input )
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    '%s: %p != [%p]' %
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ self.class, unexpected_type, @grammar_decision_description ]
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::EarlyExit
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: EarlyExit
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: all recognizers
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  The recognizer is in a <tt>(..)+</tt> subrule, meaning the recognizer must
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  match the body of the subrule one or more times. If it fails to match at least
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  one occurence of the subrule, the recognizer will raise an EarlyExit
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  exception.
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver== Example
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconsider a grammar like:
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  lexer grammar EarlyExitDemo;
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ...
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ID: 'a'..'z' ('0'..'9')+;
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernow in ruby
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  require 'EarlyExitDemo'
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input = ANTLR3::StringStream.new( "ab" )
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  lexer = EarlyExitDemo::Lexer.new( input )
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  lexer.next_token
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # -> raises EarlyExit: line 1:1 required (...)+ loop did not match 
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  #                      anything at character "b"
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass EarlyExit < RecognitionError
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :decision_number
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( decision_number, input )
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @decision_number = decision_number
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( input )
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "The recognizer did not match anything for a (..)+ loop."
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::FailedPredicate
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: FailedPredicate
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: all recognizers
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  A recognizer is in a rule with a predicate action element, and the predicating
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  action code evaluated to a +false+ value.
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass FailedPredicate < RecognitionError
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :input, :rule_name, :predicate_text
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( input, rule_name, predicate_text )
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @rule_name = rule_name
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @predicate_text = predicate_text
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( input )
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def inspect
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    '%s(%s, { %s }?)' % [ self.class.name, @rule_name, @predicate_text ]
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "rule #@rule_name failed predicate: { #@predicate_text }?"
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::MismatchedTreeNode
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: MismatchedTreeNode
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: tree parsers
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  A tree parser expects to match a tree node containing a specific type of
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  token, but the current tree node's token type does not match. It's essentially
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  the same as MismatchedToken, but used specifically for tree nodes.
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MismatchedTreeNode < RecognitionError
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :expecting, :input
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( expecting, input )
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @expecting = expecting
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( input )
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    '%s: %p != %p' %
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ self.class, unexpected_type, @expecting ]
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::RewriteCardinalityError
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: RewriteCardinalityError
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: tree-rewriting parsers and tree parsers
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  There is an inconsistency between the number of appearances of some symbol
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  on the left side of a rewrite rule and the number of the same symbol
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  seen on the right side of a rewrite rule
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass RewriteCardinalityError < StandardError
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :element_description
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( element_description )
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @element_description = element_description
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( message )
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def message
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "%s: %s" % [ self.class, @element_description ]
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::RewriteEarlyExit
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: RewriteEarlyExit
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: tree-rewriting parsers and tree parsers
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  A tree-rewrite rule requires one or more occurence of a symbol, but none
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  have been seen.
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass RewriteEarlyExit < RewriteCardinalityError
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :element_description
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( element_description = nil )
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( element_description )
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::RewriteEmptyStream
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: RewriteEmptyStream
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: tree-rewriting parsers and tree parsers
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass RewriteEmptyStream < RewriteCardinalityError; end
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Error::TreeInconsistency
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvererror:: TreeInconsistency
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverused by:: classes that deal with tree structures
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroccurs when::
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  A tree node's data is inconsistent with the overall structure to which it
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  belongs.
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversituations that result in tree inconsistencies:
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1. A node has a child node with a +@parent+ attribute different than the node.
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver2. A node has a child at index +n+, but the child's +@child_index+ value is not
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   +n+
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver3. An adaptor encountered a situation where multiple tree nodes have been
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   simultaneously requested as a new tree root.
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TreeInconsistency < StandardError
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def self.failed_index_check!( expected, real )
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    new( 
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      "%s: child indexes don't match -> expected %d found %d" %
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ self, expected, real ]
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    )
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def self.failed_parent_check!( expected, real )
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    new( 
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      "%s: parents don't match; expected %p found %p" %
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ self, expected, real ]
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    )
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def self.multiple_roots!
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    new "%s: attempted to change more than one node to root" % self
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule_function
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef MismatchedToken( expecting, input = @input )
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MismatchedToken.new( expecting, input )
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef UnwantedToken( expecting, input = @input )
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  UnwantedToken.new( expecting, input )
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef MissingToken( expecting, inserted, input = @input )
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MissingToken.new( expecting, input, inserted )
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef MismatchedRange( min, max, input = @input )
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MismatchedRange.new( min, max, input )
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef MismatchedSet( expecting, input = @input )
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MismatchedSet.new( expecting, input )
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef MismatchedNotSet( expecting, input = @input )
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MismatchedNotSet.new( expecting, input )
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef NoViableAlternative( description, decision, state, input = @input )
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NoViableAlternative.new( description, decision, state, input )
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef EarlyExit( decision, input = @input )
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EarlyExit.new( decision, input )
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef FailedPredicate( rule, predicate, input = @input )
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FailedPredicate.new( input, rule, predicate )
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef MismatchedTreeNode( expecting, input = @input )
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MismatchedTreeNode.new( expecting, input )
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef RewriteCardinalityError( element_description )
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RewriteCardinalityError.new( element_description )
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef RewriteEarlyExit( element_description = nil )
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RewriteEarlyExit.new( element_description )
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef RewriteEmptyStream( element_description )
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RewriteEmptyStream.new( element_description )
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinclude Error
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Bug
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass Bug < StandardError
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( message = nil, *args )
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    message = "something occurred that should not occur within unmodified, " <<
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              "ANTLR-generated source code: #{ message }"
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( message, *args )
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
671