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}