helma/src/FESI/Exceptions/EcmaScriptParseException.java
hns ee13186158 This commit was generated by cvs2svn to compensate for changes in r4,
which included commits to RCS files with non-trunk default branches.
2000-12-29 17:58:10 +00:00

135 lines
No EOL
4.4 KiB
Java

// EcmaScriptParseException.java
// FESI Copyright (c) Jean-Marc Lugrin, 1999
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package FESI.Exceptions;
import FESI.Parser.*;
import FESI.Interpreter.*;
/**
* Exception used to signal parsing errors
*/
public class EcmaScriptParseException extends EcmaScriptException
implements EcmaScriptConstants {
/** @serial Original parse exception */
private ParseException parseException;
/** @serial Source description */
private EvaluationSource evaluationSource;
/** @serial true if the synatx error may be that the
source is not yet complete (for interactive usage) */
private boolean canBeIncomplete = true;
/**
* Create a new parsing exception
*
* @param e The error from the parser
* @param s The evaluation source location of the error
*/
public EcmaScriptParseException(ParseException e, EvaluationSource s) {
super("Parsing error");
parseException = e;
evaluationSource = s;
}
/**
* Get the line number of the error if possible
*/
public int getLineNumber() {
Token next = null;
Token tok = parseException.currentToken;
if (tok != null && tok.next != null) next = tok.next; // get offending token
if (next!=null) {
return next.beginLine;
} else {
return -1;
}
}
/**
* return true if incomplete parse (maybe the user
* is given a chance to complete it)
*/
public boolean isIncomplete() {
if (!canBeIncomplete) return false; // Some inner error
Token tok = parseException.currentToken;
if (tok != null && tok.next != null) tok = tok.next; // get offending token
return (tok.kind == EOF);
}
/**
* Indicate that this cannot be a recoverable incomplete error because,
* for example, the evaluation source is a string passed as
* a parameter to eval, not a stream read from an user.
*/
public void setNeverIncomplete() {
canBeIncomplete = false;
}
/*
* Print the error message with helpfull comments if possible
*/
public String getMessage() {
Token tok = parseException.currentToken;
Token next = null;
String retval;
if (tok != null && tok.kind==UNTERMINATED_STRING_LITERAL) {
retval = "Unterminated string constant near line " + tok.beginLine +
", column " + tok.beginColumn;
} else {
if (tok != null && tok.next != null) next = tok.next; // get offending token
if (next != null & isForFutureExtension(next.kind)) {
retval = "Keyword '" + next.image +
"' reserved for future extension near line " +
next.beginLine +
", column " + next.beginColumn;
} else {
retval = "Syntax error detected near line " + next.beginLine +
", column " + next.beginColumn;
}
if (tok != null) {
retval += ", after " + parseException.tokenImage[tok.kind];
}
}
retval += eol + evaluationSource;
return retval;
}
private boolean isForFutureExtension(int k) {
return
k==CASE ||
k==CATCH||
k==CLASS ||
k==CONST ||
k==DEBUGGER ||
k==_DEFAULT ||
k==DO ||
k==ENUM ||
k==EXPORT ||
k==EXTENDS ||
k==FINALLY ||
k==IMPORT ||
k==SUPER ||
k==SWITCH ||
k==THROW ||
k==TRY;
}
}