2013-02-16 05:30:47 +08:00
|
|
|
/*
|
|
|
|
* [The "BSD license"]
|
|
|
|
* Copyright (c) 2013 Terence Parr
|
|
|
|
* Copyright (c) 2013 Sam Harwell
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
*
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
|
|
* derived from this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
2013-02-17 05:17:55 +08:00
|
|
|
|
|
|
|
using System;
|
2013-02-16 05:30:47 +08:00
|
|
|
using Antlr4.Runtime;
|
|
|
|
using Antlr4.Runtime.Misc;
|
|
|
|
using Sharpen;
|
|
|
|
|
|
|
|
namespace Antlr4.Runtime
|
|
|
|
{
|
2013-02-16 22:14:20 +08:00
|
|
|
/// <summary>The root of the ANTLR exception hierarchy.</summary>
|
|
|
|
/// <remarks>
|
|
|
|
/// The root of the ANTLR exception hierarchy. In general, ANTLR tracks just
|
|
|
|
/// 3 kinds of errors: prediction errors, failed predicate errors, and
|
|
|
|
/// mismatched input errors. In each case, the parser knows where it is
|
|
|
|
/// in the input, where it is in the ATN, the rule invocation stack,
|
|
|
|
/// and what kind of problem occurred.
|
|
|
|
/// </remarks>
|
2013-03-06 05:32:11 +08:00
|
|
|
#if !PORTABLE
|
2013-02-16 22:14:20 +08:00
|
|
|
[System.Serializable]
|
2013-03-06 05:32:11 +08:00
|
|
|
#endif
|
2013-02-17 05:17:55 +08:00
|
|
|
public class RecognitionException : Exception
|
2013-02-16 22:14:20 +08:00
|
|
|
{
|
|
|
|
private const long serialVersionUID = -3861826954750022374L;
|
|
|
|
|
2013-08-05 10:08:51 +08:00
|
|
|
/// <summary>
|
|
|
|
/// The
|
2013-08-05 11:36:11 +08:00
|
|
|
/// <see cref="IRecognizer"/>
|
2013-08-05 10:08:51 +08:00
|
|
|
/// where this exception originated.
|
|
|
|
/// </summary>
|
|
|
|
[Nullable]
|
2013-08-05 10:37:35 +08:00
|
|
|
private readonly IRecognizer recognizer;
|
2013-02-16 22:14:20 +08:00
|
|
|
|
2013-08-05 10:08:51 +08:00
|
|
|
[Nullable]
|
|
|
|
private readonly RuleContext ctx;
|
2013-02-16 22:14:20 +08:00
|
|
|
|
2013-08-05 10:08:51 +08:00
|
|
|
[Nullable]
|
|
|
|
private readonly IIntStream input;
|
2013-02-16 22:14:20 +08:00
|
|
|
|
2013-08-05 10:08:51 +08:00
|
|
|
/// <summary>
|
|
|
|
/// The current
|
|
|
|
/// <see cref="IToken">IToken</see>
|
|
|
|
/// when an error occurred. Since not all streams
|
|
|
|
/// support accessing symbols by index, we have to track the
|
|
|
|
/// <see cref="IToken">IToken</see>
|
|
|
|
/// instance itself.
|
|
|
|
/// </summary>
|
2013-02-16 22:14:20 +08:00
|
|
|
private IToken offendingToken;
|
|
|
|
|
2013-08-05 10:08:51 +08:00
|
|
|
private int offendingState = -1;
|
2013-02-16 22:14:20 +08:00
|
|
|
|
|
|
|
public RecognitionException(Lexer lexer, ICharStream input)
|
|
|
|
{
|
|
|
|
this.recognizer = lexer;
|
|
|
|
this.input = input;
|
2013-08-05 10:08:51 +08:00
|
|
|
this.ctx = null;
|
2013-02-16 22:14:20 +08:00
|
|
|
}
|
|
|
|
|
2014-02-17 05:25:16 +08:00
|
|
|
public RecognitionException(IRecognizer recognizer, IIntStream input, ParserRuleContext ctx)
|
2013-02-16 22:14:20 +08:00
|
|
|
{
|
|
|
|
this.recognizer = recognizer;
|
|
|
|
this.input = input;
|
|
|
|
this.ctx = ctx;
|
|
|
|
if (recognizer != null)
|
|
|
|
{
|
2013-02-17 05:23:03 +08:00
|
|
|
this.offendingState = recognizer.State;
|
2013-02-16 22:14:20 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-17 05:03:32 +08:00
|
|
|
public RecognitionException(string message, IRecognizer recognizer, IIntStream input, ParserRuleContext ctx)
|
2014-02-17 03:31:35 +08:00
|
|
|
: base(message)
|
2013-02-16 22:14:20 +08:00
|
|
|
{
|
|
|
|
this.recognizer = recognizer;
|
|
|
|
this.input = input;
|
|
|
|
this.ctx = ctx;
|
|
|
|
if (recognizer != null)
|
|
|
|
{
|
2013-02-17 05:23:03 +08:00
|
|
|
this.offendingState = recognizer.State;
|
2013-02-16 22:14:20 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
2013-08-05 10:08:51 +08:00
|
|
|
/// Get the ATN state number the parser was in at the time the error
|
|
|
|
/// occurred.
|
2013-02-16 22:14:20 +08:00
|
|
|
/// </summary>
|
|
|
|
/// <remarks>
|
2013-08-05 10:08:51 +08:00
|
|
|
/// Get the ATN state number the parser was in at the time the error
|
|
|
|
/// occurred. For
|
|
|
|
/// <see cref="NoViableAltException">NoViableAltException</see>
|
|
|
|
/// and
|
|
|
|
/// <see cref="LexerNoViableAltException">LexerNoViableAltException</see>
|
|
|
|
/// exceptions, this is the
|
|
|
|
/// <see cref="Antlr4.Runtime.Atn.DecisionState">Antlr4.Runtime.Atn.DecisionState</see>
|
|
|
|
/// number. For others, it is the state whose outgoing
|
|
|
|
/// edge we couldn't match.
|
2014-02-17 04:51:37 +08:00
|
|
|
/// <p>If the state number is not known, this method returns -1.</p>
|
2013-02-16 22:14:20 +08:00
|
|
|
/// </remarks>
|
2013-02-19 09:38:59 +08:00
|
|
|
public int OffendingState
|
2013-02-16 22:14:20 +08:00
|
|
|
{
|
2013-02-19 09:34:29 +08:00
|
|
|
get
|
|
|
|
{
|
|
|
|
return offendingState;
|
|
|
|
}
|
2013-02-19 09:38:59 +08:00
|
|
|
protected set
|
2013-02-19 09:34:29 +08:00
|
|
|
{
|
|
|
|
int offendingState = value;
|
|
|
|
this.offendingState = offendingState;
|
|
|
|
}
|
2013-02-16 22:14:20 +08:00
|
|
|
}
|
|
|
|
|
2013-08-05 10:08:51 +08:00
|
|
|
/// <summary>
|
|
|
|
/// Gets the set of input symbols which could potentially follow the
|
|
|
|
/// previously matched symbol at the time this exception was thrown.
|
|
|
|
/// </summary>
|
|
|
|
/// <remarks>
|
|
|
|
/// Gets the set of input symbols which could potentially follow the
|
|
|
|
/// previously matched symbol at the time this exception was thrown.
|
2014-02-17 04:51:37 +08:00
|
|
|
/// <p>If the set of expected tokens is not known and could not be computed,
|
2013-08-05 10:08:51 +08:00
|
|
|
/// this method returns
|
|
|
|
/// <code>null</code>
|
2014-02-17 04:51:37 +08:00
|
|
|
/// .</p>
|
2013-08-05 10:08:51 +08:00
|
|
|
/// </remarks>
|
|
|
|
/// <returns>
|
|
|
|
/// The set of token types that could potentially follow the current
|
|
|
|
/// state in the ATN, or
|
|
|
|
/// <code>null</code>
|
|
|
|
/// if the information is not available.
|
|
|
|
/// </returns>
|
2013-08-05 11:01:15 +08:00
|
|
|
[return: Nullable]
|
2013-02-16 22:14:20 +08:00
|
|
|
public virtual IntervalSet GetExpectedTokens()
|
|
|
|
{
|
2013-08-05 10:08:51 +08:00
|
|
|
if (recognizer != null)
|
2013-02-16 22:14:20 +08:00
|
|
|
{
|
2013-08-05 10:08:51 +08:00
|
|
|
return recognizer.Atn.GetExpectedTokens(offendingState, ctx);
|
2013-02-16 22:14:20 +08:00
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2013-08-05 10:08:51 +08:00
|
|
|
/// <summary>
|
|
|
|
/// Gets the
|
|
|
|
/// <see cref="RuleContext">RuleContext</see>
|
|
|
|
/// at the time this exception was thrown.
|
2014-02-17 04:51:37 +08:00
|
|
|
/// <p>If the context is not available, this method returns
|
2013-08-05 10:08:51 +08:00
|
|
|
/// <code>null</code>
|
2014-02-17 04:51:37 +08:00
|
|
|
/// .</p>
|
2013-08-05 10:08:51 +08:00
|
|
|
/// </summary>
|
|
|
|
/// <returns>
|
|
|
|
/// The
|
|
|
|
/// <see cref="RuleContext">RuleContext</see>
|
|
|
|
/// at the time this exception was thrown.
|
|
|
|
/// If the context is not available, this method returns
|
|
|
|
/// <code>null</code>
|
|
|
|
/// .
|
|
|
|
/// </returns>
|
2013-02-19 09:34:29 +08:00
|
|
|
public virtual RuleContext Context
|
2013-02-16 22:14:20 +08:00
|
|
|
{
|
2013-02-19 09:34:29 +08:00
|
|
|
get
|
|
|
|
{
|
|
|
|
return ctx;
|
|
|
|
}
|
2013-02-16 22:14:20 +08:00
|
|
|
}
|
|
|
|
|
2013-08-05 10:08:51 +08:00
|
|
|
/// <summary>
|
|
|
|
/// Gets the input stream which is the symbol source for the recognizer where
|
|
|
|
/// this exception was thrown.
|
|
|
|
/// </summary>
|
|
|
|
/// <remarks>
|
|
|
|
/// Gets the input stream which is the symbol source for the recognizer where
|
|
|
|
/// this exception was thrown.
|
2014-02-17 04:51:37 +08:00
|
|
|
/// <p>If the input stream is not available, this method returns
|
2013-08-05 10:08:51 +08:00
|
|
|
/// <code>null</code>
|
2014-02-17 04:51:37 +08:00
|
|
|
/// .</p>
|
2013-08-05 10:08:51 +08:00
|
|
|
/// </remarks>
|
|
|
|
/// <returns>
|
|
|
|
/// The input stream which is the symbol source for the recognizer
|
|
|
|
/// where this exception was thrown, or
|
|
|
|
/// <code>null</code>
|
|
|
|
/// if the stream is not
|
|
|
|
/// available.
|
|
|
|
/// </returns>
|
2013-02-19 09:34:29 +08:00
|
|
|
public virtual IIntStream InputStream
|
2013-02-16 22:14:20 +08:00
|
|
|
{
|
2013-02-19 09:34:29 +08:00
|
|
|
get
|
|
|
|
{
|
|
|
|
return input;
|
|
|
|
}
|
2013-02-16 22:14:20 +08:00
|
|
|
}
|
|
|
|
|
2013-02-19 09:38:59 +08:00
|
|
|
public IToken OffendingToken
|
2013-02-16 22:14:20 +08:00
|
|
|
{
|
2013-02-19 09:34:29 +08:00
|
|
|
get
|
|
|
|
{
|
|
|
|
return offendingToken;
|
|
|
|
}
|
2013-02-19 09:38:59 +08:00
|
|
|
protected set
|
2013-02-19 09:34:29 +08:00
|
|
|
{
|
|
|
|
IToken offendingToken = value;
|
|
|
|
this.offendingToken = offendingToken;
|
|
|
|
}
|
2013-02-16 22:14:20 +08:00
|
|
|
}
|
|
|
|
|
2013-08-05 10:08:51 +08:00
|
|
|
/// <summary>
|
|
|
|
/// Gets the
|
2013-08-05 11:36:11 +08:00
|
|
|
/// <see cref="IRecognizer"/>
|
2013-08-05 10:08:51 +08:00
|
|
|
/// where this exception occurred.
|
2014-02-17 04:51:37 +08:00
|
|
|
/// <p>If the recognizer is not available, this method returns
|
2013-08-05 10:08:51 +08:00
|
|
|
/// <code>null</code>
|
2014-02-17 04:51:37 +08:00
|
|
|
/// .</p>
|
2013-08-05 10:08:51 +08:00
|
|
|
/// </summary>
|
|
|
|
/// <returns>
|
|
|
|
/// The recognizer where this exception occurred, or
|
|
|
|
/// <code>null</code>
|
|
|
|
/// if
|
|
|
|
/// the recognizer is not available.
|
|
|
|
/// </returns>
|
2013-02-19 09:38:59 +08:00
|
|
|
public virtual IRecognizer Recognizer
|
2013-02-16 22:14:20 +08:00
|
|
|
{
|
2013-02-19 09:34:29 +08:00
|
|
|
get
|
|
|
|
{
|
|
|
|
return recognizer;
|
|
|
|
}
|
2013-02-16 22:14:20 +08:00
|
|
|
}
|
|
|
|
}
|
2013-02-16 05:30:47 +08:00
|
|
|
}
|