package de.gaalop.tba.cfgImport.optimization.maxima;
import de.gaalop.dfg.Expression;
import de.gaalop.dfg.*;
import de.gaalop.tba.cfgImport.optimization.maxima.parser.MaximaBaseVisitor;
import de.gaalop.tba.cfgImport.optimization.maxima.parser.MaximaParser;
/**
* Implements a visitor for the lexer base visitor from ANTLR grammar parser to read in maximas output
* @author Christian Steinmetz
*/
public class MaximaVisitor extends MaximaBaseVisitor<Expression> {
private Expression processFunction(String name, Expression arg) {
for (MathFunction mathFunction : MathFunction.values())
if (mathFunction.toString().toLowerCase().equals(name))
return new MathFunctionCall(arg, mathFunction);
throw new IllegalArgumentException("Function " + name + " is not supported by maxima parser");
}
@Override
public Expression visitMv_coefficient(MaximaParser.Mv_coefficientContext ctx) {
return new MultivectorComponent(ctx.name.getText(), Integer.parseInt(ctx.index.getText()));
}
@Override
public Expression visitFunction(MaximaParser.FunctionContext ctx) {
return processFunction(ctx.name.getText(), visit(ctx.arg));
}
@Override
public Expression visitExponentiation(MaximaParser.ExponentiationContext ctx) {
return new Exponentiation(visit(ctx.left), visit(ctx.right));
}
@Override
public Expression visitDivision(MaximaParser.DivisionContext ctx) {
return new Division(visit(ctx.left), visit(ctx.right));
}
@Override
public Expression visitVariable(MaximaParser.VariableContext ctx) {
return new Variable(ctx.name.getText());
}
@Override
public Expression visitNegation(MaximaParser.NegationContext ctx) {
return new Negation(visit(ctx.operand));
}
@Override
public Expression visitConstant(MaximaParser.ConstantContext ctx) {
String text = ctx.getText();
if ("%pi".equals(text)) return new FloatConstant(Math.PI);
if ("%i".equals(text)) return new MathFunctionCall(new FloatConstant(-1), MathFunction.SQRT);
return new FloatConstant(Double.parseDouble(text));
}
@Override
public Expression visitSubtraction(MaximaParser.SubtractionContext ctx) {
return new Subtraction(visit(ctx.left), visit(ctx.right));
}
@Override
public Expression visitAddition(MaximaParser.AdditionContext ctx) {
return new Addition(visit(ctx.left), visit(ctx.right));
}
@Override
public Expression visitMultiplication(MaximaParser.MultiplicationContext ctx) {
return new Multiplication(visit(ctx.left), visit(ctx.right));
}
@Override
public Expression visitBracket(MaximaParser.BracketContext ctx) {
return visit(ctx.ex);
}
@Override
public Expression visitNegationBracket(MaximaParser.NegationBracketContext ctx) {
return new Negation(visit(ctx.operand));
}
}