Home | History | Annotate | Download | only in Tree
      1 /*
      2  * [The "BSD licence"]
      3  * Copyright (c) 2005-2008 Terence Parr
      4  * All rights reserved.
      5  *
      6  * Conversion to C#:
      7  * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
      8  * All rights reserved.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. The name of the author may not be used to endorse or promote products
     19  *    derived from this software without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 namespace Antlr.Runtime.Tree
     34 {
     35 
     36     /** <summary>A node representing erroneous token range in token stream</summary> */
     37     [System.Serializable]
     38     public class CommonErrorNode : CommonTree
     39     {
     40         public IIntStream input;
     41         public IToken start;
     42         public IToken stop;
     43         public RecognitionException trappedException;
     44 
     45         public CommonErrorNode( ITokenStream input, IToken start, IToken stop,
     46                                RecognitionException e )
     47         {
     48             //System.out.println("start: "+start+", stop: "+stop);
     49             if ( stop == null ||
     50                  ( stop.TokenIndex < start.TokenIndex &&
     51                   stop.Type != TokenTypes.EndOfFile ) )
     52             {
     53                 // sometimes resync does not consume a token (when LT(1) is
     54                 // in follow set.  So, stop will be 1 to left to start. adjust.
     55                 // Also handle case where start is the first token and no token
     56                 // is consumed during recovery; LT(-1) will return null.
     57                 stop = start;
     58             }
     59             this.input = input;
     60             this.start = start;
     61             this.stop = stop;
     62             this.trappedException = e;
     63         }
     64 
     65         #region Properties
     66         public override bool IsNil
     67         {
     68             get
     69             {
     70                 return false;
     71             }
     72         }
     73         public override string Text
     74         {
     75             get
     76             {
     77                 string badText = null;
     78                 if ( start is IToken )
     79                 {
     80                     int i = ( (IToken)start ).TokenIndex;
     81                     int j = ( (IToken)stop ).TokenIndex;
     82                     if ( ( (IToken)stop ).Type == TokenTypes.EndOfFile )
     83                     {
     84                         j = ( (ITokenStream)input ).Count;
     85                     }
     86                     badText = ( (ITokenStream)input ).ToString( i, j );
     87                 }
     88                 else if ( start is ITree )
     89                 {
     90                     badText = ( (ITreeNodeStream)input ).ToString( start, stop );
     91                 }
     92                 else
     93                 {
     94                     // people should subclass if they alter the tree type so this
     95                     // next one is for sure correct.
     96                     badText = "<unknown>";
     97                 }
     98                 return badText;
     99             }
    100             set
    101             {
    102             }
    103         }
    104         public override int Type
    105         {
    106             get
    107             {
    108                 return TokenTypes.Invalid;
    109             }
    110             set
    111             {
    112             }
    113         }
    114         #endregion
    115 
    116         public override string ToString()
    117         {
    118             if ( trappedException is MissingTokenException )
    119             {
    120                 return "<missing type: " +
    121                        ( (MissingTokenException)trappedException ).MissingType +
    122                        ">";
    123             }
    124             else if ( trappedException is UnwantedTokenException )
    125             {
    126                 return "<extraneous: " +
    127                        ( (UnwantedTokenException)trappedException ).UnexpectedToken +
    128                        ", resync=" + Text + ">";
    129             }
    130             else if ( trappedException is MismatchedTokenException )
    131             {
    132                 return "<mismatched token: " + trappedException.Token + ", resync=" + Text + ">";
    133             }
    134             else if ( trappedException is NoViableAltException )
    135             {
    136                 return "<unexpected: " + trappedException.Token +
    137                        ", resync=" + Text + ">";
    138             }
    139             return "<error: " + Text + ">";
    140         }
    141     }
    142 }
    143