/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package expressao;
import java.util.List;
import org.nfunk.jep.JEP;
import org.nfunk.jep.Node;
/**
*
* @author Usuario
*/
public class ParserExpressao implements IParser{
JEP j;
public ParserExpressao(List<String> var) {
int i;
j = new JEP();
for (i=0;i<var.size();i++)
j.addConstant(var.get(i), (Object) 0);
j.addConstant("ß0", (Object) 0);
j.addConstant("ß1", (Object) 0);
j.addConstant("ß2", (Object) 0);
j.addConstant("ß3", (Object) 0);
j.addConstant("ß4", (Object) 0);
j.addConstant("ß5", (Object) 0);
j.addConstant("ß6", (Object) 0);
j.addConstant("ß7", (Object) 0);
j.addConstant("ß8", (Object) 0);
j.addConstant("ß9", (Object) 0);
j.addConstant("ß10", (Object) 0);
j.addFunction("LN", new Func());
j.addFunction("LOG", new Func());
j.addFunction("EXP", new Func());
j.addFunction("SORT", new Func());
j.addFunction("TRUNC", new Func());
// j.addStandardConstants();
// j.addStandardFunctions();
// j.addComplex();
j.setImplicitMul(false);
// j.setAllowAssignment(true);
// j.setAllowUndeclared(true);
}
private int analisaErro(String erro) {
int colIni, colFin;
String strRetorno = "";
colIni = erro.indexOf("column")+7;
colFin = erro.indexOf('.');
if (colIni > 0 && colFin > 0)
strRetorno = erro.substring(colIni, colFin);
if (strRetorno.isEmpty())
return 0;
else
return Integer.parseInt(strRetorno);
}
private String traduzMsgErro(int colIni, String erro, String info){
String novaMsgErro="";
int posDoisPontos, col, pos;
if (erro.contains("Could not evaluate")){
novaMsgErro = "Não foi possível avaliar";
posDoisPontos = erro.indexOf(':');
novaMsgErro = novaMsgErro.concat(erro.substring(18,posDoisPontos+1));
novaMsgErro = novaMsgErro.concat(" a variável/coeficiente não é válida(o)");
}
if (info.contains("Function") && info.contains("requires")){
novaMsgErro = "A função ";
pos = info.indexOf('"')+1;
while ((pos < info.length()) && (info.charAt(pos)!='"')) {
novaMsgErro = novaMsgErro.concat(info.substring(pos, pos + 1));
pos++;
}
novaMsgErro = novaMsgErro.concat(" requer ");
novaMsgErro = novaMsgErro.concat(info.substring(pos+11,pos+13));
novaMsgErro = novaMsgErro.concat("parâmetro(s)");
}
col = colIni+analisaErro(info);
if (col>0){
novaMsgErro = novaMsgErro.concat("\nErro na coluna: ");
novaMsgErro = novaMsgErro.concat(String.valueOf(col));
}
return novaMsgErro;
}
@Override
public boolean expressaoValida(String expressao) throws Exception {
boolean sucesso=true;
String msgErro = "", exp1;
int i, erro = 0;
if (expressao.trim().isEmpty()){
sucesso=false;
throw new MinhaExcecao("Erro: faltou expressão");
}else{
exp1 = expressao.trim();
try {
i=0;
Node n = j.parseExpression(exp1);
j.evaluate(n);
} catch (Exception e) {
if (erro == 0){
System.err.println("Erro: " + e.getMessage());
System.err.println("Info: " + j.getErrorInfo());
erro = 1;
msgErro = traduzMsgErro(0,e.getMessage(),j.getErrorInfo());
}
}
}
if (erro == 1){
sucesso=false;
throw new MinhaExcecao(msgErro);
}
return sucesso;
}
}