001    package org.codehaus.groovy.syntax;
002    
003    import org.codehaus.groovy.syntax.Types;
004    import org.codehaus.groovy.syntax.Token;
005    import org.codehaus.groovy.syntax.ParserException;
006    
007    public class UnexpectedTokenException extends ParserException {
008        private Token unexpectedToken;
009        private int[] expectedTypes;
010        private String comment;
011    
012        public UnexpectedTokenException(Token token) {
013            this(token, null, null );
014        }
015        
016        public UnexpectedTokenException(Token token, int expectedType) {
017            this(token, new int[] { expectedType });
018        }
019        
020        public UnexpectedTokenException(Token token, int[] expectedTypes) {
021            this(token, expectedTypes, null );
022        }
023    
024        public UnexpectedTokenException(Token token, int[] expectedTypes, String comment) {
025            super("Unexpected token", token);
026            this.unexpectedToken = token;
027            this.expectedTypes = expectedTypes;
028            this.comment       = comment;
029        }
030    
031        public Token getUnexpectedToken() {
032            return this.unexpectedToken;
033        }
034    
035        public int[] getExpectedTypes() {
036            return this.expectedTypes;
037        }
038    
039        public String getUnexpectedTokenText( ) {
040            String text = null;
041            if( this.unexpectedToken != null )
042            {
043                text = this.unexpectedToken.getText();
044            }
045    
046            if( text == null )
047            {
048                text = "";
049            }
050    
051            return text;
052        }
053    
054        public String getMessage() {
055            StringBuffer message = new StringBuffer();
056    
057            if( expectedTypes != null ) {
058                message.append( "expected " );
059    
060                if (this.expectedTypes.length == 1) {
061                    message.append( Types.getDescription(this.expectedTypes[0]) );
062                }
063                else {
064                    message.append("one of { ");
065        
066                    for (int i = 0; i < expectedTypes.length; ++i) {
067                        message.append( Types.getDescription(this.expectedTypes[i]) );
068        
069                        if ((i + 1) < expectedTypes.length) {
070                            if( expectedTypes.length > 2 ) {
071                                message.append(", ");
072                            }
073                            else {
074                                message.append(" ");
075                            }
076                        }
077    
078                        if ((i + 2) == expectedTypes.length) {
079                            message.append("or ");
080                        }
081                    }
082        
083                    message.append(" }");
084                }
085    
086                message.append( "; found '" );
087            }
088            else {
089                message.append( "could not use '" );
090            }
091    
092            message.append( getUnexpectedTokenText() ).append( "'" );
093            if( unexpectedToken != null ) {
094                message.append(" at " + unexpectedToken.getStartLine() + ":" + unexpectedToken.getStartColumn());
095            }
096            else {
097                message.append(" at unknown location (probably end of file)");
098            }
099    
100            if( comment != null ) {
101                message.append( "; " );
102                message.append( comment );
103            }
104    
105            return message.toString();
106        }
107    }