1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD licence"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2005-2008 Terence Parr 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Conversion to C#: 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc. 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met: 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer. 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer in the 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * documentation and/or other materials provided with the distribution. 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * derived from this software without specific prior written permission. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using Antlr.Runtime.Tree; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using ArgumentException = System.ArgumentException; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using ArgumentNullException = System.ArgumentNullException; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using Exception = System.Exception; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using SerializationInfo = System.Runtime.Serialization.SerializationInfo; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using StreamingContext = System.Runtime.Serialization.StreamingContext; 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>The root of the ANTLR exception hierarchy.</summary> 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * To avoid English-only error messages and to generally make things 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * as flexible as possible, these exceptions are not created with strings, 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * but rather the information necessary to generate an error. Then 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the various reporting methods in Parser and Lexer can be overridden 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to generate a localized error message. For example, MismatchedToken 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * exceptions are built with the expected token type. 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * So, don't expect getMessage() to return anything. 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Note that as of Java 1.4, you can access the stack trace, which means 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * that you can compute the complete trace of rules from the start symbol. 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This gives you considerable context information with which to generate 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * useful error messages. 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ANTLR generates code that throws exceptions upon recognition error and 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * also generates code to catch these exceptions in each rule. If you 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * want to quit upon first error, you can turn off the automatic error 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * handling mechanism using rulecatch action, but you still need to 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * override methods mismatch and recoverFromMismatchSet. 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * In general, the recognition exceptions can track where in a grammar a 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * problem occurred and/or what was the expected input. While the parser 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * knows its state (such as current input symbol and line info) that 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * state can change before the exception is reported so current token index 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is computed and stored at exception time. From this info, you can 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * perhaps print an entire line of input not just a single token, for example. 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Better to just say the recognizer had a problem and then let the parser 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * figure out a fancy report. 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver [System.Serializable] 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public class RecognitionException : Exception 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>What input stream did the error occur in?</summary> */ 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private IIntStream _input; 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>What is index of token/char were we looking at when the error occurred?</summary> */ 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _index; 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The current Token when an error occurred. Since not all streams 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * can retrieve the ith Token, we have to track the Token object. 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * For parsers. Even when it's a tree parser, token might be set. 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private IToken _token; 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If this is a tree parser exception, node is set to the node with 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the problem. 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private object _node; 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>The current char when an error occurred. For lexers.</summary> */ 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _c; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Track the line (1-based) at which the error occurred in case this is 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * generated from a lexer. We need to track this since the 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * unexpected char doesn't carry the line info. 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _line; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The 0-based index into the line where the error occurred. 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _charPositionInLine; 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you are parsing a tree node stream, you will encounter som 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * imaginary nodes w/o line/col info. We now search backwards looking 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for most recent token with line/col info, but notify getErrorHeader() 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * that info is approximate. 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private bool _approximateLineInfo; 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Used for remote debugger deserialization</summary> */ 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException() 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this("A recognition error occurred.", null, null) 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException( IIntStream input ) 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this("A recognition error occurred.", input, null) 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException(string message) 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this(message, null, null) 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException(string message, IIntStream input) 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this(message, input, null) 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException(string message, Exception innerException) 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this(message, null, innerException) 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException(string message, IIntStream input, Exception innerException) 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : base(message, innerException) 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._input = input; 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (input != null) 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._index = input.Index; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (input is ITokenStream) 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._token = ((ITokenStream)input).LT(1); 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = _token.Line; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = _token.CharPositionInLine; 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeNodeStream tns = input as ITreeNodeStream; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tns != null) 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ExtractInformationFromTreeNodeStream(tns); 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ICharStream charStream = input as ICharStream; 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (charStream != null) 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._c = input.LA(1); 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = ((ICharStream)input).Line; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = ((ICharStream)input).CharPositionInLine; 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._c = input.LA(1); 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected RecognitionException(SerializationInfo info, StreamingContext context) 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : base(info, context) 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (info == null) 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentNullException("info"); 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index = info.GetInt32("Index"); 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _c = info.GetInt32("C"); 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _line = info.GetInt32("Line"); 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _charPositionInLine = info.GetInt32("CharPositionInLine"); 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _approximateLineInfo = info.GetBoolean("ApproximateLineInfo"); 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Return the token type or char of the unexpected input element</summary> */ 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int UnexpectedType 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( _input is ITokenStream ) 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _token.Type; 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeNodeStream treeNodeStream = _input as ITreeNodeStream; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( treeNodeStream != null ) 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeAdaptor adaptor = treeNodeStream.TreeAdaptor; 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return adaptor.GetType( _node ); 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _c; 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public bool ApproximateLineInfo 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _approximateLineInfo; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected set 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _approximateLineInfo = value; 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public IIntStream Input 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _input; 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected set 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _input = value; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public IToken Token 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _token; 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _token = value; 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public object Node 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _node; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected set 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _node = value; 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int Character 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _c; 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected set 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _c = value; 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int Index 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _index; 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected set 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index = value; 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int Line 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _line; 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _line = value; 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int CharPositionInLine 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _charPositionInLine; 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _charPositionInLine = value; 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public override void GetObjectData(SerializationInfo info, StreamingContext context) 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (info == null) 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentNullException("info"); 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver base.GetObjectData(info, context); 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver info.AddValue("Index", _index); 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver info.AddValue("C", _c); 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver info.AddValue("Line", _line); 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver info.AddValue("CharPositionInLine", _charPositionInLine); 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver info.AddValue("ApproximateLineInfo", _approximateLineInfo); 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected virtual void ExtractInformationFromTreeNodeStream(ITreeNodeStream input) 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._node = input.LT(1); 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITokenStreamInformation streamInformation = input as ITokenStreamInformation; 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (streamInformation != null) 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IToken lastToken = streamInformation.LastToken; 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IToken lastRealToken = streamInformation.LastRealToken; 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (lastRealToken != null) 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._token = lastRealToken; 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = lastRealToken.Line; 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = lastRealToken.CharPositionInLine; 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._approximateLineInfo = lastRealToken.Equals(lastToken); 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeAdaptor adaptor = input.TreeAdaptor; 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IToken payload = adaptor.GetToken(_node); 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (payload != null) 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._token = payload; 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (payload.Line <= 0) 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // imaginary node; no line/pos info; scan backwards 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int i = -1; 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object priorNode = input.LT(i); 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (priorNode != null) 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IToken priorPayload = adaptor.GetToken(priorNode); 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (priorPayload != null && priorPayload.Line > 0) 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we found the most recent real line / pos info 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = priorPayload.Line; 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = priorPayload.CharPositionInLine; 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._approximateLineInfo = true; 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver --i; 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver priorNode = input.LT(i); 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (ArgumentException) 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver priorNode = null; 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // node created from real token 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = payload.Line; 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = payload.CharPositionInLine; 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (this._node is Tree.ITree) 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = ((Tree.ITree)this._node).Line; 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = ((Tree.ITree)this._node).CharPositionInLine; 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (this._node is CommonTree) 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._token = ((CommonTree)this._node).Token; 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int type = adaptor.GetType(this._node); 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string text = adaptor.GetText(this._node); 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._token = new CommonToken(type, text); 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 405