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 using Antlr.Runtime.Tree; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using ArgumentNullException = System.ArgumentNullException; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using Exception = System.Exception; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using NonSerialized = System.NonSerializedAttribute; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using SerializationInfo = System.Runtime.Serialization.SerializationInfo; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using StreamingContext = System.Runtime.Serialization.StreamingContext; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>The root of the ANTLR exception hierarchy.</summary> 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * To avoid English-only error messages and to generally make things 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * as flexible as possible, these exceptions are not created with strings, 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * but rather the information necessary to generate an error. Then 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the various reporting methods in Parser and Lexer can be overridden 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to generate a localized error message. For example, MismatchedToken 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * exceptions are built with the expected token type. 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * So, don't expect getMessage() to return anything. 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Note that as of Java 1.4, you can access the stack trace, which means 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * that you can compute the complete trace of rules from the start symbol. 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This gives you considerable context information with which to generate 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * useful error messages. 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ANTLR generates code that throws exceptions upon recognition error and 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * also generates code to catch these exceptions in each rule. If you 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * want to quit upon first error, you can turn off the automatic error 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * handling mechanism using rulecatch action, but you still need to 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * override methods mismatch and recoverFromMismatchSet. 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * In general, the recognition exceptions can track where in a grammar a 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * problem occurred and/or what was the expected input. While the parser 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * knows its state (such as current input symbol and line info) that 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * state can change before the exception is reported so current token index 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is computed and stored at exception time. From this info, you can 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * perhaps print an entire line of input not just a single token, for example. 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Better to just say the recognizer had a problem and then let the parser 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * figure out a fancy report. 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver [System.Serializable] 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public class RecognitionException : Exception { 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>What input stream did the error occur in?</summary> */ 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private IIntStream _input; 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>What is index of token/char were we looking at when the error occurred?</summary> */ 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _index; 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The current Token when an error occurred. Since not all streams 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * can retrieve the ith Token, we have to track the Token object. 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * For parsers. Even when it's a tree parser, token might be set. 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private IToken _token; 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If this is a tree parser exception, node is set to the node with 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the problem. 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private object _node; 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>The current char when an error occurred. For lexers.</summary> */ 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _c; 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Track the line (1-based) at which the error occurred in case this is 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * generated from a lexer. We need to track this since the 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * unexpected char doesn't carry the line info. 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _line; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The 0-based index into the line where the error occurred. 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _charPositionInLine; 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you are parsing a tree node stream, you will encounter som 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * imaginary nodes w/o line/col info. We now search backwards looking 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for most recent token with line/col info, but notify getErrorHeader() 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * that info is approximate. 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private bool _approximateLineInfo; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Used for remote debugger deserialization</summary> */ 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException() 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this("A recognition error occurred.", null, null) { 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException(IIntStream input) 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this("A recognition error occurred.", input, null) { 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException(string message) 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this(message, null, null) { 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException(string message, IIntStream input) 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this(message, input, null) { 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException(string message, Exception innerException) 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this(message, null, innerException) { 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public RecognitionException(string message, IIntStream input, Exception innerException) 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : base(message, innerException) { 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._input = input; 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (input != null) { 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._index = input.Index; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (input is ITokenStream) { 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._token = ((ITokenStream)input).LT(1); 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = _token.Line; 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = _token.CharPositionInLine; 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (input is ITreeNodeStream) { 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ExtractInformationFromTreeNodeStream(input); 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else if (input is ICharStream) { 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._c = input.LA(1); 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = ((ICharStream)input).Line; 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = ((ICharStream)input).CharPositionInLine; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._c = input.LA(1); 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected RecognitionException(SerializationInfo info, StreamingContext context) 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : base(info, context) { 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (info == null) 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentNullException("info"); 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index = info.GetInt32("Index"); 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _c = info.GetInt32("C"); 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _line = info.GetInt32("Line"); 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _charPositionInLine = info.GetInt32("CharPositionInLine"); 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _approximateLineInfo = info.GetBoolean("ApproximateLineInfo"); 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Return the token type or char of the unexpected input element</summary> */ 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int UnexpectedType { 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (_input is ITokenStream) { 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _token.Type; 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeNodeStream treeNodeStream = _input as ITreeNodeStream; 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (treeNodeStream != null) { 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeAdaptor adaptor = treeNodeStream.TreeAdaptor; 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return adaptor.GetType(_node); 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _c; 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public bool ApproximateLineInfo { 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _approximateLineInfo; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected set { 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _approximateLineInfo = value; 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public IIntStream Input { 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _input; 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected set { 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _input = value; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public IToken Token { 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _token; 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set { 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _token = value; 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public object Node { 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _node; 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected set { 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _node = value; 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int Character { 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _c; 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected set { 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _c = value; 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int Index { 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _index; 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected set { 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index = value; 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int Line { 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _line; 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set { 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _line = value; 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int CharPositionInLine { 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _charPositionInLine; 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set { 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _charPositionInLine = value; 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public override void GetObjectData(SerializationInfo info, StreamingContext context) { 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (info == null) 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentNullException("info"); 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver base.GetObjectData(info, context); 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver info.AddValue("Index", _index); 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver info.AddValue("C", _c); 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver info.AddValue("Line", _line); 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver info.AddValue("CharPositionInLine", _charPositionInLine); 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver info.AddValue("ApproximateLineInfo", _approximateLineInfo); 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected virtual void ExtractInformationFromTreeNodeStream(IIntStream input) { 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITokenStreamInformation streamInformation = input as ITokenStreamInformation; 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (streamInformation != null) { 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IToken lastToken = streamInformation.LastToken; 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IToken lastRealToken = streamInformation.LastRealToken; 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (lastRealToken != null) { 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._token = lastRealToken; 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = lastRealToken.Line; 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = lastRealToken.CharPositionInLine; 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._approximateLineInfo = lastRealToken.Equals(lastToken); 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeNodeStream nodes = (ITreeNodeStream)input; 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._node = nodes.LT(1); 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeAdaptor adaptor = nodes.TreeAdaptor; 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IToken payload = adaptor.GetToken(_node); 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (payload != null) { 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._token = payload; 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (payload.Line <= 0) { 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // imaginary node; no line/pos info; scan backwards 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int i = -1; 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object priorNode = nodes.LT(i); 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (priorNode != null) { 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IToken priorPayload = adaptor.GetToken(priorNode); 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (priorPayload != null && priorPayload.Line > 0) { 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we found the most recent real line / pos info 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = priorPayload.Line; 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = priorPayload.CharPositionInLine; 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._approximateLineInfo = true; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver --i; 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver priorNode = nodes.LT(i); 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { // node created from real token 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = payload.Line; 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = payload.CharPositionInLine; 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else if (this._node is Tree.ITree) { 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._line = ((Tree.ITree)this._node).Line; 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._charPositionInLine = ((Tree.ITree)this._node).CharPositionInLine; 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (this._node is CommonTree) { 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._token = ((CommonTree)this._node).Token; 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int type = adaptor.GetType(this._node); 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string text = adaptor.GetText(this._node); 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this._token = new CommonToken(type, text); 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 331