package org.reasm.m68k; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import org.reasm.AssemblyMessage; import org.reasm.expressions.EvaluationContext; import org.reasm.expressions.Expression; import org.reasm.expressions.IdentifierExpression; import org.reasm.expressions.SymbolLookup; import org.reasm.m68k.expressions.internal.ExpressionParser; import org.reasm.m68k.expressions.internal.InvalidTokenException; import org.reasm.m68k.expressions.internal.TokenType; import org.reasm.m68k.expressions.internal.Tokenizer; import ca.fragag.Consumer; /** * Contains methods related to expressions. * * @author Francis Gagné */ public final class Expressions { /** * Parses an expression from a {@link CharSequence}. * * @param expression * the expression text * @param symbolLookup * an object that looks up symbols by name, which will be used to look up the symbol for identifiers when the * identifier is {@linkplain IdentifierExpression#evaluate(EvaluationContext) evaluated}, or <code>null</code> to * consider all identifiers undefined * @param assemblyMessageConsumer * a {@link Consumer} that will receive the assembly messages that were raised while evaluating the expression * @return an {@link Expression} corresponding to the expression text */ @Nonnull public static Expression parse(@Nonnull CharSequence expression, @CheckForNull SymbolLookup symbolLookup, @CheckForNull Consumer<AssemblyMessage> assemblyMessageConsumer) { if (expression == null) { throw new NullPointerException("expression"); } final Tokenizer tokenizer = new Tokenizer(); tokenizer.setCharSequence(expression); final Expression result; try { result = ExpressionParser.parse(tokenizer, symbolLookup, assemblyMessageConsumer); } catch (InvalidTokenException e) { throw new IllegalArgumentException("Not a valid expression: " + expression.toString()); } if (result == null || tokenizer.getTokenType() != TokenType.END) { throw new IllegalArgumentException("Not a valid expression: " + expression.toString()); } return result; } // This class is not meant to be instantiated. private Expressions() { } }