1 package org.codehaus.groovy.syntax.parser;
2
3 import org.codehaus.groovy.syntax.Types;
4 import org.codehaus.groovy.syntax.Token;
5
6 public class UnexpectedTokenException extends ParserException {
7 private Token unexpectedToken;
8 private int[] expectedTypes;
9 private String comment;
10
11 public UnexpectedTokenException(Token token) {
12 this(token, null, null );
13 }
14
15 public UnexpectedTokenException(Token token, int expectedType) {
16 this(token, new int[] { expectedType });
17 }
18
19 public UnexpectedTokenException(Token token, int[] expectedTypes) {
20 this(token, expectedTypes, null );
21 }
22
23 public UnexpectedTokenException(Token token, int[] expectedTypes, String comment) {
24 super("Unexpected token", token);
25 this.unexpectedToken = token;
26 this.expectedTypes = expectedTypes;
27 this.comment = comment;
28 }
29
30 public Token getUnexpectedToken() {
31 return this.unexpectedToken;
32 }
33
34 public int[] getExpectedTypes() {
35 return this.expectedTypes;
36 }
37
38 public String getUnexpectedTokenText( ) {
39 String text = null;
40 if( this.unexpectedToken != null )
41 {
42 text = this.unexpectedToken.getText();
43 }
44
45 if( text == null )
46 {
47 text = "";
48 }
49
50 return text;
51 }
52
53 public String getMessage() {
54 StringBuffer message = new StringBuffer();
55
56 if( expectedTypes != null ) {
57 message.append( "expected " );
58
59 if (this.expectedTypes.length == 1) {
60 message.append( Types.getDescription(this.expectedTypes[0]) );
61 }
62 else {
63 message.append("one of { ");
64
65 for (int i = 0; i < expectedTypes.length; ++i) {
66 message.append( Types.getDescription(this.expectedTypes[i]) );
67
68 if ((i + 1) < expectedTypes.length) {
69 if( expectedTypes.length > 2 ) {
70 message.append(", ");
71 }
72 else {
73 message.append(" ");
74 }
75 }
76
77 if ((i + 2) == expectedTypes.length) {
78 message.append("or ");
79 }
80 }
81
82 message.append(" }");
83 }
84
85 message.append( "; found '" );
86 }
87 else {
88 message.append( "could not use '" );
89 }
90
91 message.append( getUnexpectedTokenText() ).append( "'" );
92 if( unexpectedToken != null ) {
93 message.append(" at " + unexpectedToken.getStartLine() + ":" + unexpectedToken.getStartColumn());
94 }
95 else {
96 message.append(" at unknown location (probably end of file)");
97 }
98
99 if( comment != null ) {
100 message.append( "; " );
101 message.append( comment );
102 }
103
104 return message.toString();
105 }
106 }