1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.runtime.tree
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    import org.antlr.runtime.*;
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public class CommonErrorNode extends CommonTree {
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	public var input:IntStream;
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	public var start:Token;
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	public var stop:Token;
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	public var trappedException:RecognitionException;
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	public function CommonErrorNode(input:TokenStream, start:Token, stop:Token,
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    						   e:RecognitionException)
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	{
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		//System.out.println("start: "+start+", stop: "+stop);
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		if ( stop==null ||
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			 (stop.tokenIndex < start.tokenIndex &&
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			  stop.type!=TokenConstants.EOF) )
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		{
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			// sometimes resync does not consume a token (when LT(1) is
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			// in follow set.  So, stop will be 1 to left to start. adjust.
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			// Also handle case where start is the first token and no token
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			// is consumed during recovery; LT(-1) will return null.
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			stop = start;
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		}
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		this.input = input;
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		this.start = start;
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		this.stop = stop;
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		this.trappedException = e;
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	}
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	public override function get isNil():Boolean {
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		return false;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	}
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	public function getType():int {
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		return TokenConstants.INVALID_TOKEN_TYPE;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	}
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	public function getText():String {
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		var badText:String = null;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		if ( start is Token ) {
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			var i:int = Token(start).tokenIndex;
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			var j:int = Token(stop).tokenIndex;
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			if ( Token(stop).type == TokenConstants.EOF ) {
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    				j = TokenStream(input).size;
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			}
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			badText = TokenStream(input).toStringWithRange(i, j);
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		}
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		else if ( start is Tree ) {
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			badText = TreeNodeStream(input).toStringWithRange(start, stop);
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		}
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		else {
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			// people should subclass if they alter the tree type so this
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			// next one is for sure correct.
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			badText = "<unknown>";
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		}
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		return badText;
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	}
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	public override function toString():String {
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		if ( trappedException is MissingTokenException ) {
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			return "<missing type: "+
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    				   MissingTokenException(trappedException).missingType+
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    				   ">";
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		}
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		else if ( trappedException is UnwantedTokenException ) {
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			return "<extraneous: "+
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    				   UnwantedTokenException(trappedException).unexpectedToken+
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    				   ", resync="+getText()+">";
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		}
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		else if ( trappedException is MismatchedTokenException ) {
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			return "<mismatched token: "+trappedException.token+", resync="+getText()+">";
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		}
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		else if ( trappedException is NoViableAltException ) {
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    			return "<unexpected: "+trappedException.token+
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    				   ", resync="+getText()+">";
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		}
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		return "<error: "+getText()+">";
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    	}
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver       
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}