/*
* This software is subject to the terms of the Eclipse Public License v1.0
* Agreement, available at the following URL:
* http://www.eclipse.org/legal/epl-v10.html.
* You must accept the terms of that agreement to use this software.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package mondrian.parser;
import mondrian.olap.*;
import mondrian.server.Statement;
/**
* Default implementation of {@link MdxParserValidator}, using the
* <a href="http://java.net/projects/javacc/">JavaCC</a> parser generator.
*
* @author jhyde
*/
public class JavaccParserValidatorImpl implements MdxParserValidator {
private final QueryPartFactory factory;
/**
* Creates a JavaccParserValidatorImpl.
*/
public JavaccParserValidatorImpl() {
this(new Parser.FactoryImpl());
}
/**
* Creates a JavaccParserValidatorImpl with an explicit factory for parse
* tree nodes.
*
* @param factory Factory for parse tree nodes
*/
public JavaccParserValidatorImpl(QueryPartFactory factory) {
this.factory = factory;
}
public QueryPart parseInternal(
Statement statement,
String queryString,
boolean debug,
FunTable funTable,
boolean strictValidation)
{
final MdxParserImpl mdxParser =
new MdxParserImpl(
factory,
statement,
queryString,
debug,
funTable,
strictValidation);
try {
return mdxParser.statementEof();
} catch (ParseException e) {
throw convertException(queryString, e);
}
}
public Exp parseExpression(
Statement statement,
String queryString,
boolean debug,
FunTable funTable)
{
final MdxParserImpl mdxParser =
new MdxParserImpl(
factory,
statement,
queryString,
debug,
funTable,
false);
try {
return mdxParser.expressionEof();
} catch (ParseException e) {
throw convertException(queryString, e);
}
}
/**
* Converts the exception so that it looks like the exception produced by
* JavaCUP. (Not that that format is ideal, but it minimizes test output
* changes during the transition from JavaCUP to JavaCC.)
*
* @param queryString MDX query string
* @param pe JavaCC parse exception
* @return Wrapped exception
*/
private RuntimeException convertException(
String queryString,
ParseException pe)
{
Exception e;
if (pe.getMessage().startsWith("Encountered ")) {
e = new MondrianException(
"Syntax error at line "
+ pe.currentToken.next.beginLine
+ ", column "
+ pe.currentToken.next.beginColumn
+ ", token '"
+ pe.currentToken.next.image
+ "'");
} else {
e = pe;
}
return Util.newError(e, "While parsing " + queryString);
}
}
// End JavaccParserValidatorImpl.java