Ajout d'un interpréteur arithmétique
This commit is contained in:
parent
37f8ea1b00
commit
526e724db5
761
src/net/mc_pandacraft/java/util/JArithmeticInterpreter.java
Normal file
761
src/net/mc_pandacraft/java/util/JArithmeticInterpreter.java
Normal file
@ -0,0 +1,761 @@
|
|||||||
|
package net.mc_pandacraft.java.util;
|
||||||
|
|
||||||
|
//******************************************************************************
|
||||||
|
//***
|
||||||
|
//*** INTERPRETEUR ARITHMETIQUE version 2.1 Version Java
|
||||||
|
//***
|
||||||
|
//***
|
||||||
|
//***
|
||||||
|
//******************************************************************************
|
||||||
|
|
||||||
|
/*
|
||||||
|
Historique:
|
||||||
|
|
||||||
|
2.1:
|
||||||
|
- Version Java disponible:
|
||||||
|
# les operateurs mathematiques disponibles sont ceux de Java donc certains manquent.
|
||||||
|
|
||||||
|
2.0:
|
||||||
|
- Portage en C++ et debut en Java
|
||||||
|
|
||||||
|
Version C++:
|
||||||
|
|
||||||
|
- Meilleure gestion memoire lors de la construction de l'expression.
|
||||||
|
- Acceleration de certaines operations.
|
||||||
|
|
||||||
|
Version Java:
|
||||||
|
|
||||||
|
- Premiere version. Normalement ca doit marcher
|
||||||
|
|
||||||
|
1.3b: ajoute les fonctions suivantes: (NON DISTRIBUEE)
|
||||||
|
- reconnaissance du symbole <EFBFBD>
|
||||||
|
- ecriture formatee d'expression (<EFBFBD> ameliorer)
|
||||||
|
|
||||||
|
1.2: corrige les bugs suivants:
|
||||||
|
- erreur sur l'interpretation de fonctions unaires imbriquees telles que ln(exp(x)).
|
||||||
|
- la fonction puissance (pour les puissances entieres).
|
||||||
|
ajoute:
|
||||||
|
- la verification de la chaine entree (voir code d'erreur)
|
||||||
|
- la verification de l'existence de l'evaluation (voir code d'erreur)
|
||||||
|
|
||||||
|
|
||||||
|
1.1: corrige un bug au niveau de l'interpretation des fonctions du type:
|
||||||
|
|
||||||
|
exp(-(x+y))
|
||||||
|
|
||||||
|
1.0: premiere version
|
||||||
|
|
||||||
|
Le code source peut etre librement modifie et distribue.
|
||||||
|
|
||||||
|
Puisqu'il s'agit d'un essai en Java, le code ne doit pas etre super genial et merite sans doute
|
||||||
|
quelques modifications.En particulier, il serait interessant de rajouter le support des Exceptions
|
||||||
|
pour les calculs (division par zero, etc...).
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Classe servant <EFBFBD> palier l'absence de passage par variables ou reference
|
||||||
|
|
||||||
|
class VariableInt {
|
||||||
|
public int mValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Classe principale
|
||||||
|
|
||||||
|
public class JArithmeticInterpreter {
|
||||||
|
|
||||||
|
// Variables
|
||||||
|
|
||||||
|
int mOperator;
|
||||||
|
double mValue;
|
||||||
|
JArithmeticInterpreter fg, fd;
|
||||||
|
|
||||||
|
// Methods
|
||||||
|
|
||||||
|
//.................................................................................... Node
|
||||||
|
|
||||||
|
private JArithmeticInterpreter() {
|
||||||
|
this(0, 0, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
//.................................................................................... Node
|
||||||
|
|
||||||
|
private JArithmeticInterpreter(int Operator,double Value,JArithmeticInterpreter Fg,JArithmeticInterpreter Fd) {
|
||||||
|
mOperator=Operator;
|
||||||
|
mValue=Value;
|
||||||
|
fg=Fg;
|
||||||
|
fd=Fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JArithmeticInterpreter(int Operator,double Value) {
|
||||||
|
this(Operator, Value, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
//.................................................................................... Construct_Tree
|
||||||
|
|
||||||
|
private static JArithmeticInterpreter constructTree(StringBuffer string,int length,int error) {
|
||||||
|
int imbric,Bimbric;
|
||||||
|
int priorite,ope;
|
||||||
|
int position,positionv,i,j;
|
||||||
|
int opetemp=0;
|
||||||
|
int espa=0,espat=0;
|
||||||
|
int caspp=0;
|
||||||
|
|
||||||
|
JArithmeticInterpreter node;
|
||||||
|
|
||||||
|
// Initialisation des variables
|
||||||
|
|
||||||
|
if (length<=0) {
|
||||||
|
error=3;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ope=0;
|
||||||
|
imbric=0;Bimbric=128;
|
||||||
|
priorite=6;
|
||||||
|
i=0;
|
||||||
|
positionv=position=0;
|
||||||
|
|
||||||
|
// Mise en place des donnees sur le morceau de chaine
|
||||||
|
|
||||||
|
while (i<length) {
|
||||||
|
|
||||||
|
if (((string.charAt(i)>47) && (string.charAt(i)<58)) || (string.charAt(i)=='<27>')) {
|
||||||
|
if (priorite>5) {
|
||||||
|
priorite=5;
|
||||||
|
positionv=i;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ((string.charAt(i)>96) && (string.charAt(i)<117)) {
|
||||||
|
VariableInt Vopetemp,Vespat;
|
||||||
|
|
||||||
|
Vopetemp= new VariableInt();
|
||||||
|
Vespat= new VariableInt();
|
||||||
|
|
||||||
|
Vopetemp.mValue=opetemp;
|
||||||
|
Vespat.mValue=espat;
|
||||||
|
|
||||||
|
FindOperator(Vopetemp,Vespat,string,i);
|
||||||
|
|
||||||
|
opetemp=Vopetemp.mValue;
|
||||||
|
espat=Vespat.mValue;
|
||||||
|
|
||||||
|
if (opetemp>=0) {
|
||||||
|
if (imbric<Bimbric) {
|
||||||
|
Bimbric=imbric;
|
||||||
|
ope=opetemp;
|
||||||
|
position=i;
|
||||||
|
priorite=4;
|
||||||
|
espa=espat;
|
||||||
|
}
|
||||||
|
else if ((imbric==Bimbric) && (priorite >=4)) {
|
||||||
|
ope=opetemp;
|
||||||
|
position=i;
|
||||||
|
priorite=4;
|
||||||
|
espa=espat;
|
||||||
|
}
|
||||||
|
j=i+1;
|
||||||
|
i+=espat;
|
||||||
|
while(j<i)
|
||||||
|
j++;
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (string.charAt(i)=='t') {
|
||||||
|
if (priorite==6) ope=-1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else if (string.charAt(i)=='p') {
|
||||||
|
if (priorite==6) ope=-2;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else if (string.charAt(i)=='r') {
|
||||||
|
if (priorite==6) ope=-2;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else if (string.charAt(i)=='n') {
|
||||||
|
if (priorite==6) ope=-1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
error=2; // symbole non reconnu
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
switch(string.charAt(i)) {
|
||||||
|
case '(':
|
||||||
|
imbric++;
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
case ')':
|
||||||
|
imbric--;
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
if (imbric<Bimbric) {
|
||||||
|
Bimbric=imbric;
|
||||||
|
priorite=1;
|
||||||
|
ope=1;
|
||||||
|
position=i;
|
||||||
|
caspp=0;
|
||||||
|
}
|
||||||
|
else if ((imbric==Bimbric) && (priorite >=1)) {
|
||||||
|
priorite=1;
|
||||||
|
ope=1;
|
||||||
|
position=i;
|
||||||
|
caspp=0;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
if (imbric<Bimbric) {
|
||||||
|
if ((i-1)<0) {
|
||||||
|
if (priorite>5) {
|
||||||
|
priorite=1;
|
||||||
|
position=i;
|
||||||
|
ope=2;
|
||||||
|
Bimbric=imbric;
|
||||||
|
caspp=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (string.charAt(i-1)=='(') {
|
||||||
|
if (priorite>1){
|
||||||
|
priorite=1;
|
||||||
|
position=i;
|
||||||
|
Bimbric=imbric;
|
||||||
|
caspp=1;
|
||||||
|
ope=2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Bimbric=imbric;
|
||||||
|
priorite=1;
|
||||||
|
ope=2;
|
||||||
|
position=i;
|
||||||
|
caspp=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((imbric==Bimbric) && (priorite>=1)) {
|
||||||
|
if ((i-1)<0) {
|
||||||
|
if (priorite>5) {
|
||||||
|
priorite=1;
|
||||||
|
position=i;
|
||||||
|
ope=2;
|
||||||
|
caspp=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (string.charAt(i-1)=='(') {
|
||||||
|
if (priorite>1){
|
||||||
|
priorite=1;
|
||||||
|
position=i;
|
||||||
|
caspp=1;
|
||||||
|
ope=2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
priorite=1;
|
||||||
|
ope=2;
|
||||||
|
position=i;
|
||||||
|
caspp=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
case '*':
|
||||||
|
if (imbric<Bimbric) {
|
||||||
|
Bimbric=imbric;
|
||||||
|
priorite=2;
|
||||||
|
ope=3;
|
||||||
|
position=i;
|
||||||
|
}
|
||||||
|
else if ((imbric==Bimbric) && (priorite>=2)) {
|
||||||
|
priorite=2;
|
||||||
|
ope=3;
|
||||||
|
position=i;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
if (imbric<Bimbric) {
|
||||||
|
Bimbric=imbric;
|
||||||
|
priorite=2;
|
||||||
|
ope=4;
|
||||||
|
position=i;
|
||||||
|
}
|
||||||
|
else if ((imbric==Bimbric) && (priorite>=2)) {
|
||||||
|
priorite=2;
|
||||||
|
ope=4;
|
||||||
|
position=i;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
case '^':
|
||||||
|
if (imbric<Bimbric) {
|
||||||
|
Bimbric=imbric;
|
||||||
|
priorite=3;
|
||||||
|
ope=5;
|
||||||
|
position=i;
|
||||||
|
}
|
||||||
|
else if ((imbric==Bimbric) && (priorite>=3)) {
|
||||||
|
priorite=3;
|
||||||
|
ope=5;
|
||||||
|
position=i;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
case '.':
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error=2; // symbole non reconnu
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (imbric!=0) {
|
||||||
|
error=1; // erreur de "parenthesage"
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Traitement des donnees
|
||||||
|
|
||||||
|
if (priorite==6) {
|
||||||
|
node =new JArithmeticInterpreter(ope,0.0);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
else if (caspp==1) {
|
||||||
|
node = new JArithmeticInterpreter(2,0);
|
||||||
|
|
||||||
|
node.fg= new JArithmeticInterpreter(0,0);
|
||||||
|
node.fd= new JArithmeticInterpreter();
|
||||||
|
|
||||||
|
if ((length-position-1-Bimbric)==0) { // argument absent
|
||||||
|
error=3;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
StringBuffer temp=CopyPartialString(string,(position+1),(length-1-Bimbric));
|
||||||
|
node.fd=constructTree(temp,(length-position-1-Bimbric),error);
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (priorite==5) {
|
||||||
|
node = new JArithmeticInterpreter(0,calc_const(string,positionv),null,null);
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
else if (ope>5) {
|
||||||
|
node = new JArithmeticInterpreter(ope,0,null,null);
|
||||||
|
|
||||||
|
if ((length-position-espa-Bimbric)==0) { // argument absent
|
||||||
|
error=3;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
StringBuffer temp=CopyPartialString(string,(position+espa),(length-1));
|
||||||
|
node.fg=constructTree(temp,(length-position-espa-Bimbric),error);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
node = new JArithmeticInterpreter(ope,0,null,null);
|
||||||
|
|
||||||
|
if ((position-Bimbric)==0) { // argument absent
|
||||||
|
error=3;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
StringBuffer temp=CopyPartialString(string,Bimbric,(position-1));
|
||||||
|
node.fg=constructTree(temp,(position-Bimbric),error);
|
||||||
|
if ((length-position-1-Bimbric)==0) { // argument absent
|
||||||
|
error=3;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
temp=CopyPartialString(string,(position+1),(length-1-Bimbric));
|
||||||
|
node.fd=constructTree(temp,(length-position-1-Bimbric),error);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//....................................................................................
|
||||||
|
|
||||||
|
private double computeTree() {
|
||||||
|
if (mOperator==0) return mValue;
|
||||||
|
int error = 0;
|
||||||
|
|
||||||
|
double valueL=fg.computeTree();
|
||||||
|
|
||||||
|
if (error!=0) return 0;
|
||||||
|
double valueR=0;
|
||||||
|
|
||||||
|
if (fd!=null) valueR=fd.computeTree();
|
||||||
|
if (error!=0) return 0;
|
||||||
|
|
||||||
|
switch(mOperator) {
|
||||||
|
case 1: // +
|
||||||
|
return (valueL+valueR);
|
||||||
|
case 2: // -
|
||||||
|
return (valueL-valueR);
|
||||||
|
case 3: // *
|
||||||
|
return (valueL*valueR);
|
||||||
|
case 4: // -
|
||||||
|
if (valueR==0) {
|
||||||
|
error=1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (valueL/valueR);
|
||||||
|
case 5: // ^
|
||||||
|
return Math.pow(valueL,valueR);
|
||||||
|
case 6: // exp
|
||||||
|
return Math.exp(valueL);
|
||||||
|
case 7: // ln
|
||||||
|
if (valueL<=0) {
|
||||||
|
if (valueL<0) error=2;
|
||||||
|
else error=1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (Math.log(valueL)/Math.log(2));
|
||||||
|
case 8: // log
|
||||||
|
if (valueL<=0) {
|
||||||
|
if (valueL<0) error=2;
|
||||||
|
else error=1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return Math.log(valueL);
|
||||||
|
case 9: // sqrt
|
||||||
|
if (valueL<0) {
|
||||||
|
error=2;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return Math.sqrt(valueL);
|
||||||
|
case 10: // abs
|
||||||
|
return Math.abs(valueL);
|
||||||
|
case 11:
|
||||||
|
return Math.sin(valueL); // sin
|
||||||
|
case 12:
|
||||||
|
return Math.cos(valueL); // cos
|
||||||
|
case 13:
|
||||||
|
return Math.tan(valueL); // tan
|
||||||
|
case 14:
|
||||||
|
return Math.asin(valueL); // asin
|
||||||
|
case 15:
|
||||||
|
return Math.acos(valueL); // acos
|
||||||
|
case 16:
|
||||||
|
return Math.atan(valueL); // atan
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//.................................................................................... Write_Tree
|
||||||
|
|
||||||
|
private void writeTree(StringBuffer string) {
|
||||||
|
boolean parenthese=false;
|
||||||
|
|
||||||
|
switch(mOperator) {
|
||||||
|
case -2:
|
||||||
|
string.append('y');
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
string.append('x');
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
string.append(mValue);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append('+');
|
||||||
|
fd.writeTree(string);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if ((fg.mOperator==0) && (fg.mValue==0));
|
||||||
|
else fg.writeTree(string);
|
||||||
|
string.append('-');
|
||||||
|
if ((fd.mOperator==1) || (fd.mOperator==2)) {
|
||||||
|
parenthese=true;
|
||||||
|
string.append('(');
|
||||||
|
}
|
||||||
|
fd.writeTree(string);
|
||||||
|
if (parenthese==true) {
|
||||||
|
string.append(')');
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if ((fg.mOperator==1) || (fg.mOperator==2)) {
|
||||||
|
parenthese=true;
|
||||||
|
string.append('(');
|
||||||
|
}
|
||||||
|
fg.writeTree(string);
|
||||||
|
if (parenthese==true)
|
||||||
|
string.append(')');
|
||||||
|
parenthese=false;
|
||||||
|
string.append('*');
|
||||||
|
if ((fd.mOperator==1) || (fd.mOperator==2)) {
|
||||||
|
parenthese=true;
|
||||||
|
string.append('(');
|
||||||
|
}
|
||||||
|
fd.writeTree(string);
|
||||||
|
if (parenthese==true)
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if ((fg.mOperator==1) || (fg.mOperator==2)) {
|
||||||
|
parenthese=true;
|
||||||
|
string.append('(');
|
||||||
|
}
|
||||||
|
fg.writeTree(string);
|
||||||
|
if (parenthese==true)
|
||||||
|
string.append(')');
|
||||||
|
parenthese=false;
|
||||||
|
string.append('/');
|
||||||
|
if ((fd.mOperator>0) && (fd.mOperator<5)) {
|
||||||
|
parenthese=true;
|
||||||
|
string.append('(');
|
||||||
|
}
|
||||||
|
fd.writeTree(string);
|
||||||
|
if (parenthese==true)
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if ((fg.mOperator>0) && (fg.mOperator<5)) {
|
||||||
|
parenthese=true;
|
||||||
|
string.append('(');
|
||||||
|
}
|
||||||
|
fg.writeTree(string);
|
||||||
|
if (parenthese==true)
|
||||||
|
string.append(')');
|
||||||
|
parenthese=false;
|
||||||
|
string.append('^');
|
||||||
|
if ((fd.mOperator>0) && (fd.mOperator<5)) {
|
||||||
|
parenthese=true;
|
||||||
|
string.append('(');
|
||||||
|
}
|
||||||
|
fd.writeTree(string);
|
||||||
|
if (parenthese==true)
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
string.append("exp(");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
string.append("log(");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
string.append("ln(");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
string.append("<EFBFBD>(");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
string.append("|");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append('|');
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
string.append("sin(");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
string.append("cos(");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
string.append("tan(");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
string.append("asin(");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
string.append("acos(");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
string.append("atan(");
|
||||||
|
fg.writeTree(string);
|
||||||
|
string.append(')');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//.................................................................................... calc_const
|
||||||
|
|
||||||
|
private static double calc_const(StringBuffer chaine,int pos) {
|
||||||
|
int i=pos,j;
|
||||||
|
double temp=0;
|
||||||
|
int signe=1;
|
||||||
|
int longueur=chaine.length();
|
||||||
|
|
||||||
|
|
||||||
|
if (chaine.charAt(i)=='-') {
|
||||||
|
signe=-1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (chaine.charAt(i)=='<27>') return signe*Math.PI;
|
||||||
|
|
||||||
|
while (i<longueur && chaine.charAt(i)>47 && chaine.charAt(i)<58) {
|
||||||
|
temp=temp*10+(chaine.charAt(i)-48);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i<longueur && chaine.charAt(i)=='.') {
|
||||||
|
i++;
|
||||||
|
j=1;
|
||||||
|
while (i<longueur && chaine.charAt(i)>47 && chaine.charAt(i)<58) {
|
||||||
|
temp=temp+(chaine.charAt(i)-48)*Math.exp(-j*2.30258509);
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (signe*temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//.................................................................................... FindOperator
|
||||||
|
|
||||||
|
private static void FindOperator(VariableInt oper,VariableInt esp,StringBuffer chaine,int pos) {
|
||||||
|
switch(chaine.charAt(pos)) {
|
||||||
|
case 'a':
|
||||||
|
switch(chaine.charAt(pos+1)) {
|
||||||
|
case 'b':
|
||||||
|
esp.mValue=3;
|
||||||
|
oper.mValue=10;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
esp.mValue=4;
|
||||||
|
oper.mValue=15;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
esp.mValue=4;
|
||||||
|
oper.mValue=14;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
esp.mValue=4;
|
||||||
|
oper.mValue=16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
if (chaine.charAt(pos+1)=='h') {
|
||||||
|
esp.mValue=2;
|
||||||
|
oper.mValue=18;
|
||||||
|
}
|
||||||
|
else if ((chaine.charAt(pos+1)=='o') && (chaine.charAt(pos+2)=='s')) {
|
||||||
|
if (chaine.charAt(pos+3)=='h') {
|
||||||
|
esp.mValue=4;
|
||||||
|
oper.mValue=18;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
esp.mValue=3;
|
||||||
|
oper.mValue=12;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if ((chaine.charAt(pos+1)=='x') && (chaine.charAt(pos+2)=='p')) {
|
||||||
|
esp.mValue=3;
|
||||||
|
oper.mValue=6;
|
||||||
|
}
|
||||||
|
else oper.mValue=-10;
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
if (chaine.charAt(pos+1)=='n') {
|
||||||
|
esp.mValue=2;
|
||||||
|
oper.mValue=7;
|
||||||
|
}
|
||||||
|
else if ((chaine.charAt(pos+1)=='o') && (chaine.charAt(pos+2)=='g')){
|
||||||
|
esp.mValue=3;
|
||||||
|
oper.mValue=8;
|
||||||
|
}
|
||||||
|
else oper.mValue=-10;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
if (chaine.charAt(pos+1)=='h') {
|
||||||
|
esp.mValue=2;
|
||||||
|
oper.mValue=17;
|
||||||
|
}
|
||||||
|
else if (chaine.charAt(pos+1)=='q') {
|
||||||
|
esp.mValue=4;
|
||||||
|
oper.mValue=9;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (chaine.charAt(pos+3)=='h') {
|
||||||
|
esp.mValue=4;
|
||||||
|
oper.mValue=17;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
esp.mValue=3;
|
||||||
|
oper.mValue=11;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
if (chaine.charAt(pos+1)=='h') {
|
||||||
|
esp.mValue=2;
|
||||||
|
oper.mValue=19;
|
||||||
|
}
|
||||||
|
else if ((chaine.charAt(pos+1)=='a') && (chaine.charAt(pos+2)=='n')) {
|
||||||
|
if (chaine.charAt(pos+3)=='h') {
|
||||||
|
esp.mValue=4;
|
||||||
|
oper.mValue=19;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
esp.mValue=3;
|
||||||
|
oper.mValue=13;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else oper.mValue=-10;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
oper.mValue=-10;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//.................................................................................... CopyPartialString
|
||||||
|
|
||||||
|
private static StringBuffer CopyPartialString(StringBuffer chaine,int debut,int fin) {
|
||||||
|
StringBuffer chartemp;
|
||||||
|
int a=fin-debut+1;
|
||||||
|
chartemp=new StringBuffer(a+1);
|
||||||
|
|
||||||
|
for(int i=0;i<a;i++) chartemp.append(chaine.charAt(debut+i));
|
||||||
|
|
||||||
|
return chartemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static double getResultFromExpression(String expr)
|
||||||
|
{
|
||||||
|
StringBuffer input = new StringBuffer(expr);
|
||||||
|
|
||||||
|
JArithmeticInterpreter jai = JArithmeticInterpreter.constructTree(input,input.length(),0);
|
||||||
|
|
||||||
|
if (jai==null)
|
||||||
|
throw new IllegalArgumentException("Le calcul passé en paramètre est invalide");
|
||||||
|
|
||||||
|
return jai.computeTree();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
public static void main(String args[]) {
|
||||||
|
|
||||||
|
String disp_res = StringUtil.formatDouble(JArithmeticInterpreter.getResultFromExpression("1245.25*2"));
|
||||||
|
|
||||||
|
System.out.println(disp_res);
|
||||||
|
} //*/
|
||||||
|
|
||||||
|
}
|
11
src/net/mc_pandacraft/java/util/StringUtil.java
Normal file
11
src/net/mc_pandacraft/java/util/StringUtil.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package net.mc_pandacraft.java.util;
|
||||||
|
|
||||||
|
public class StringUtil {
|
||||||
|
public static String formatDouble(double d)
|
||||||
|
{
|
||||||
|
if(d == (long) d)
|
||||||
|
return String.format("%d",(long)d);
|
||||||
|
else
|
||||||
|
return String.valueOf((float)d);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user