/* gnu.classpath.tools.gjdoc.expr.Evaluator Copyright (C) 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Classpath 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 General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Classpath; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ package gnu.classpath.tools.gjdoc.expr; import java.io.StringReader; import java.math.BigInteger; import antlr.RecognitionException; import antlr.TokenStreamException; import java.util.Set; public class Evaluator { /** * Try to evaluate the given Java expression in the context of the * given environment. * * @param expression the Java expression to evaluate. The * expression string must not include a terminating semicolon. * * @param source the FieldDoc (part of) whose constant field value * expression is being evaluated. Used to prevent circular * references. * * @param environment callback hook used by the Evaluator to query * the value of static fields referenced in the expression. * * @return a Java object representing the value of the expression, * or <code>null</code> if the expression evaluates to * <code>null</code>. * * @throws IllegalExpressionException if the expression is * invalid, uses unsupported syntax constructs (e.g. method calls, * array access) or references unknown static fields. */ public static Object evaluate(String expression, Set visitedFields, EvaluatorEnvironment environment) throws IllegalExpressionException { try { JavaLexer lexer = new JavaLexer(new StringReader(expression)); JavaRecognizer recognizer = new JavaRecognizer(lexer); Expression e = recognizer.expression(); ConstantExpression value = e.evaluate(new Context(environment, visitedFields)); return value.asObject(); } catch (RecognitionException e) { throw new IllegalExpressionException(e); } catch (TokenStreamException e) { throw new IllegalExpressionException(e); } } static int parseInt(String stringValue) { int base = 10; if (stringValue.startsWith("0x")) { base = 16; stringValue = stringValue.substring(2); } else if (stringValue.length() > 1 && stringValue.startsWith("0")) { base = 8; stringValue = stringValue.substring(1); } while (stringValue.length() > 1 && stringValue.startsWith("0")) { stringValue = stringValue.substring(1); } if (10 == base) { return Integer.parseInt(stringValue); } else { long result = Long.parseLong(stringValue, base); if (result > Integer.MAX_VALUE) { result -= 0x100000000L; } if (result > Integer.MAX_VALUE) { throw new NumberFormatException(result + " > " + Integer.MAX_VALUE); } else if (result < Integer.MIN_VALUE) { throw new NumberFormatException(result + " < " + Integer.MIN_VALUE); } else { return (int)result; } } } static long parseLong(String stringValue) { int base = 10; if (stringValue.startsWith("0x")) { base = 16; stringValue = stringValue.substring(2); } else if (stringValue.length() > 1 && stringValue.startsWith("0")) { base = 8; stringValue = stringValue.substring(1); } while (stringValue.length() > 1 && stringValue.startsWith("0")) { stringValue = stringValue.substring(1); } BigInteger bigInt = new BigInteger(stringValue, base); long result = bigInt.longValue(); return result; } }