/*
* xtc - The eXTensible Compiler
* Copyright (C) 2004-2008 Robert Grimm
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* version 2.1 as published by the Free Software Foundation.
*
* This library 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
package xtc.parser;
/**
* An erroneous parse.
*
* @author Robert Grimm
* @version $Revision: 1.27 $
*/
public final class ParseError extends Result {
/**
* The dummy parse error. The dummy parse error is used for
* initializing a production's parse error and then threading the
* most specific parse error through the production. It works like
* a sentinel for managing linked lists, avoiding repeated tests for
* a <code>null</code> value.
*
* @see SemanticValue#error
*/
public static final ParseError DUMMY = new ParseError("parse error", -1);
/** The error message. */
public final String msg;
/**
* Create a new parse error.
*
* @param msg The error message.
* @param index The index for the error location.
*/
public ParseError(final String msg, final int index) {
super(index);
this.msg = msg;
}
public boolean hasValue() {
return false;
}
public boolean hasValue(final String s) {
return false;
}
public boolean hasValueIgnoreCase(final String s) {
return false;
}
public <T> T semanticValue() {
throw new
IllegalStateException("Parse error does not have a semantic value");
}
public ParseError parseError() {
return this;
}
public ParseError select(final ParseError other) {
return this.index <= other.index ? other : this;
}
public ParseError select(final ParseError other, final int index) {
return this.index <= index || this.index <= other.index ? other : this;
}
/**
* Select the more specific parse error. This method compares this
* parse error with the specified index and returns a parse error
* representing the longer parse (creating a new parse error with
* the specified message and index if necessary).
*
* @param msg The error message.
* @param index The index of the parse error.
*/
public ParseError select(final String msg, final int index) {
return this.index <= index ? new ParseError(msg, index) : this;
}
public SemanticValue createValue(final Object value, final ParseError error) {
throw new
IllegalStateException("Parse error cannot lead to semantic value");
}
}