Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用单个字符串进行数学运算?_Java_Lexical Analysis_Lexical - Fatal编程技术网

Java 如何用单个字符串进行数学运算?

Java 如何用单个字符串进行数学运算?,java,lexical-analysis,lexical,Java,Lexical Analysis,Lexical,单个字符串包含两个数字和运算符,必须检测这两个数字,然后进行数学运算 package analizadorlexicosintaxis01; import java.lang.Math; public class AnalizadorLexicoSintaxis01 { public void Lexico(int i, int f, char[] lexema) { if (i <= f) { if (lexema[i] == '+' || lexema[i

单个字符串包含两个数字和运算符,必须检测这两个数字,然后进行数学运算

package analizadorlexicosintaxis01;

import java.lang.Math;

public class AnalizadorLexicoSintaxis01 {

public void Lexico(int i, int f, char[] lexema) {
    if (i <= f) {
        if (lexema[i] == '+' || lexema[i] == '-' || lexema[i] == '*' || lexema[i] == '/') {
            i++;
            //System.out.println("Operarodes reconocidos " + i);
            Lexico(i, f, lexema);
        } else if (lexema[i] == '0' || lexema[i] == '1' || lexema[i] == '2' || lexema[i] == '3') {
            i++;
            //System.out.println("[0, 3] Reconocidos " + i);
            Lexico(i, f, lexema);
        } else if (lexema[i] == '4' || lexema[i] == '5' || lexema[i] == '6' || lexema[i] == '7') {
            i++;
            //System.out.println("[4, 7] Reconocidos " + i);
            Lexico(i, f, lexema);
        } else if (lexema[i] == '8' || lexema[i] == '9') {
            i++;
            //System.out.println("[8, 9] Reconocidos " + i);
            Lexico(i, f, lexema);
        } else if (lexema[i] == '.') {
            i++;
            //System.out.println("punto Reconocido " + i);
            Lexico(i, f, lexema);
        } else {
            System.out.println("Error dentro del i < f");
        }
    } else if (f < 0) {
        System.out.println("Error Palabra vacia");
    } else {
        System.out.println("Lexico comprobado.");
        System.out.println("Iniciando revision de sintaxis (operadores y simbolo para decimal)");
        SintaxisA(0, f, lexema, 0, 0);
    }
   }

public void SintaxisA(int i, int f, char[] lexema, int opcont, int pcont) 
{
    if (opcont > 2) {
        System.out.println("Cadena invalida (operadores)");
    } else if (pcont > 1) {
        System.out.println("Cadena invalida (puntos)");

    } else if (i <= f) {
        //System.out.println(i);
        if (i == 0 && (lexema[i] == '.' || lexema[i] == '+' || lexema[i] == '*' || lexema[i] == '/')) {
            System.out.println("Cadena invalida (inicio no valido)");

        } else if (i == f && (lexema[i] == '.' || lexema[i] == '+' || lexema[i] == '-' || lexema[i] == '*' || lexema[i] == '/')) {
            System.out.println("Cadena invalida (final no valido)");

        } else if (lexema[i] == '+') {
            if (lexema[i + 1] == '+' || lexema[i + 1] == '*' || lexema[i + 1] == '/' || lexema[i + 1] == '.') {
                System.out.println("Cadena invalida ([+] segio por operador incompatible o punto)");
            } else {
                opcont++;
                pcont = 0;
                i++;
                //System.out.println("Conteo de opredor continuo:" + opcont);
                SintaxisA(i, f, lexema, opcont, pcont);
            }

        } else if (lexema[i] == '-') {
            if (lexema[i + 1] == '*' || lexema[i + 1] == '/' || lexema[i + 1] == '.') {
                System.out.println("Cadena invalida ([-] segio por operador incompatible o punto)");
            } else {
                opcont++;
                pcont = 0;
                i++;
                //System.out.println("Conteo de opredor continuo:" + opcont);
                SintaxisA(i, f, lexema, opcont, pcont);
            }

        } else if (lexema[i] == '*' || lexema[i] == '/') {
            if (lexema[i + 1] == '+' || lexema[i + 1] == '*' || lexema[i + 1] == '/' || lexema[i + 1] == '.') {
                System.out.println("Cadena invalida ([* o /] segio por operador incompatible o punto)");
            } else {
                opcont++;
                pcont = 0;
                i++;
                //System.out.println("Conteo de opredor continuo:" + opcont);
                SintaxisA(i, f, lexema, opcont, pcont);
            }
        } else if (lexema[i] == '.') {
            if (lexema[i + 1] == '+' || lexema[i + 1] == '-' || lexema[i + 1] == '*' || lexema[i + 1] == '/') {
                System.out.println("Cadena invalida (punto segido por operador)");
            } else {
                pcont++;
                i++;
                //System.out.println("Conteo de opredor continuo:" + opcont);
                SintaxisA(i, f, lexema, opcont, pcont);
            }
        } else {
            i++;
            opcont = 0;
            //System.out.println("procesando #" + i);
            SintaxisA(i, f, lexema, opcont, pcont);
        }
    } else {
        System.out.println("Sintaxis de operadores y simbolo decimal comprobado.");
        System.out.println("Iniciando comprobacion de Sintaxis para numeros.");
        SintaxisB(0, f, lexema, 0, 0, 0);
    }
}

public void SintaxisB(int i, int f, char[] lexema, int decimalescont, int contdp, int npalabra) {
    if (i <= f) {
        if (lexema[i] == '+' || lexema[i] == '-' || lexema[i] == '*' || lexema[i] == '/') {
            i++;
            decimalescont = 0;
            contdp = 0;
            //System.out.println("decimales: " + decimalescont + " if#1");
            SintaxisB(i, f, lexema, decimalescont, contdp, npalabra);
        } else if (lexema[i] == '.') {
            npalabra = Integer.toString(npalabra).length();
            if (npalabra != contdp) {
                System.out.println("error, cero innecesarios");
            } else {
                decimalescont++;
                i++;
                npalabra = 0;
                SintaxisB(i, f, lexema, decimalescont, contdp, npalabra);
            }

        } else if (decimalescont <= 0) {
            npalabra = npalabra * 10 + Integer.parseInt(String.valueOf(lexema[i]));
            contdp++;
            i++;
            //System.out.println(npalabra);
            SintaxisB(i, f, lexema, decimalescont, contdp, npalabra);
        } else {
            i++;
            SintaxisB(i, f, lexema, decimalescont, contdp, npalabra);
        }
    } else if (npalabra > 0 && i > f) {
        npalabra = Integer.toString(npalabra).length();
        if (npalabra != contdp) {
            System.out.println("error, ceros innecesarios");
        } else {
            System.out.println("Comprobacion de Sintaxis en numeros terminada");
            System.out.println("La cadena es aceptada");
        }
    } else {
        System.out.println("Comprobacion de Sintaxis en numeros terminada");
        System.out.println("La cadena es aceptada");
    }
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    AnalizadorLexicoSintaxis01 ab = new AnalizadorLexicoSintaxis01();
    String token = "-0.88/1";
    //System.out.println(token);
    char lex[] = token.toCharArray();
    System.out.println("Inicia ciclo. " + "long cadena: " + lex.length);
    ab.Lexico(0, lex.length - 1, lex);
}

}
我已经做了检测两个数字和操作符的部分,但是我不能为每个数字和操作符做一个子串来进行数学运算

package analizadorlexicosintaxis01;

import java.lang.Math;

public class AnalizadorLexicoSintaxis01 {

public void Lexico(int i, int f, char[] lexema) {
    if (i <= f) {
        if (lexema[i] == '+' || lexema[i] == '-' || lexema[i] == '*' || lexema[i] == '/') {
            i++;
            //System.out.println("Operarodes reconocidos " + i);
            Lexico(i, f, lexema);
        } else if (lexema[i] == '0' || lexema[i] == '1' || lexema[i] == '2' || lexema[i] == '3') {
            i++;
            //System.out.println("[0, 3] Reconocidos " + i);
            Lexico(i, f, lexema);
        } else if (lexema[i] == '4' || lexema[i] == '5' || lexema[i] == '6' || lexema[i] == '7') {
            i++;
            //System.out.println("[4, 7] Reconocidos " + i);
            Lexico(i, f, lexema);
        } else if (lexema[i] == '8' || lexema[i] == '9') {
            i++;
            //System.out.println("[8, 9] Reconocidos " + i);
            Lexico(i, f, lexema);
        } else if (lexema[i] == '.') {
            i++;
            //System.out.println("punto Reconocido " + i);
            Lexico(i, f, lexema);
        } else {
            System.out.println("Error dentro del i < f");
        }
    } else if (f < 0) {
        System.out.println("Error Palabra vacia");
    } else {
        System.out.println("Lexico comprobado.");
        System.out.println("Iniciando revision de sintaxis (operadores y simbolo para decimal)");
        SintaxisA(0, f, lexema, 0, 0);
    }
   }

public void SintaxisA(int i, int f, char[] lexema, int opcont, int pcont) 
{
    if (opcont > 2) {
        System.out.println("Cadena invalida (operadores)");
    } else if (pcont > 1) {
        System.out.println("Cadena invalida (puntos)");

    } else if (i <= f) {
        //System.out.println(i);
        if (i == 0 && (lexema[i] == '.' || lexema[i] == '+' || lexema[i] == '*' || lexema[i] == '/')) {
            System.out.println("Cadena invalida (inicio no valido)");

        } else if (i == f && (lexema[i] == '.' || lexema[i] == '+' || lexema[i] == '-' || lexema[i] == '*' || lexema[i] == '/')) {
            System.out.println("Cadena invalida (final no valido)");

        } else if (lexema[i] == '+') {
            if (lexema[i + 1] == '+' || lexema[i + 1] == '*' || lexema[i + 1] == '/' || lexema[i + 1] == '.') {
                System.out.println("Cadena invalida ([+] segio por operador incompatible o punto)");
            } else {
                opcont++;
                pcont = 0;
                i++;
                //System.out.println("Conteo de opredor continuo:" + opcont);
                SintaxisA(i, f, lexema, opcont, pcont);
            }

        } else if (lexema[i] == '-') {
            if (lexema[i + 1] == '*' || lexema[i + 1] == '/' || lexema[i + 1] == '.') {
                System.out.println("Cadena invalida ([-] segio por operador incompatible o punto)");
            } else {
                opcont++;
                pcont = 0;
                i++;
                //System.out.println("Conteo de opredor continuo:" + opcont);
                SintaxisA(i, f, lexema, opcont, pcont);
            }

        } else if (lexema[i] == '*' || lexema[i] == '/') {
            if (lexema[i + 1] == '+' || lexema[i + 1] == '*' || lexema[i + 1] == '/' || lexema[i + 1] == '.') {
                System.out.println("Cadena invalida ([* o /] segio por operador incompatible o punto)");
            } else {
                opcont++;
                pcont = 0;
                i++;
                //System.out.println("Conteo de opredor continuo:" + opcont);
                SintaxisA(i, f, lexema, opcont, pcont);
            }
        } else if (lexema[i] == '.') {
            if (lexema[i + 1] == '+' || lexema[i + 1] == '-' || lexema[i + 1] == '*' || lexema[i + 1] == '/') {
                System.out.println("Cadena invalida (punto segido por operador)");
            } else {
                pcont++;
                i++;
                //System.out.println("Conteo de opredor continuo:" + opcont);
                SintaxisA(i, f, lexema, opcont, pcont);
            }
        } else {
            i++;
            opcont = 0;
            //System.out.println("procesando #" + i);
            SintaxisA(i, f, lexema, opcont, pcont);
        }
    } else {
        System.out.println("Sintaxis de operadores y simbolo decimal comprobado.");
        System.out.println("Iniciando comprobacion de Sintaxis para numeros.");
        SintaxisB(0, f, lexema, 0, 0, 0);
    }
}

public void SintaxisB(int i, int f, char[] lexema, int decimalescont, int contdp, int npalabra) {
    if (i <= f) {
        if (lexema[i] == '+' || lexema[i] == '-' || lexema[i] == '*' || lexema[i] == '/') {
            i++;
            decimalescont = 0;
            contdp = 0;
            //System.out.println("decimales: " + decimalescont + " if#1");
            SintaxisB(i, f, lexema, decimalescont, contdp, npalabra);
        } else if (lexema[i] == '.') {
            npalabra = Integer.toString(npalabra).length();
            if (npalabra != contdp) {
                System.out.println("error, cero innecesarios");
            } else {
                decimalescont++;
                i++;
                npalabra = 0;
                SintaxisB(i, f, lexema, decimalescont, contdp, npalabra);
            }

        } else if (decimalescont <= 0) {
            npalabra = npalabra * 10 + Integer.parseInt(String.valueOf(lexema[i]));
            contdp++;
            i++;
            //System.out.println(npalabra);
            SintaxisB(i, f, lexema, decimalescont, contdp, npalabra);
        } else {
            i++;
            SintaxisB(i, f, lexema, decimalescont, contdp, npalabra);
        }
    } else if (npalabra > 0 && i > f) {
        npalabra = Integer.toString(npalabra).length();
        if (npalabra != contdp) {
            System.out.println("error, ceros innecesarios");
        } else {
            System.out.println("Comprobacion de Sintaxis en numeros terminada");
            System.out.println("La cadena es aceptada");
        }
    } else {
        System.out.println("Comprobacion de Sintaxis en numeros terminada");
        System.out.println("La cadena es aceptada");
    }
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    AnalizadorLexicoSintaxis01 ab = new AnalizadorLexicoSintaxis01();
    String token = "-0.88/1";
    //System.out.println(token);
    char lex[] = token.toCharArray();
    System.out.println("Inicia ciclo. " + "long cadena: " + lex.length);
    ab.Lexico(0, lex.length - 1, lex);
}

}
package analizadorlexicosintaxis01;
导入java.lang.Math;
公共类分析词汇表01{
公共无效词汇(inti,intf,char[]词汇){
如果(i)2{
系统输出打印(“卡德纳残疾人歌剧院”);
}否则如果(pcont>1){
系统输出打印(“卡德纳残疾人(puntos)”;

}else-if(i我不知道你为什么要用大量的
if-else
语句来实现这一点。但是在Java中,内置了
Javascript引擎
,可以从
字符串
值计算简单的数学表达式。因此,如果你只需要用单个字符串进行数学运算,那么我建议如下:

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

public class Math {
    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine engine = scriptEngineManager.getEngineByName("JavaScript");
        String number = "-0.88/1";
        System.out.println(engine.eval(number));
     } 
}
s.split((?x+y),
减去('-',(x,y)->x-y),
相乘('*',(x,y)->x*y),
除以(“/”,(x,y)->x/y);
字符操作;
二进制运算符;
计算器(字符操作、二进制运算符){
这个操作=操作;
this.operator=操作员;
}
静态整数计算(字符c、整数a、整数b){
回流
.of(值())
.filter(calculator->calculator.operation==c)
.findFirst().OrelsThrow(运行时异常::新建)
操作人员
.适用(a,b);
}
静态整数计算(字符串s){

String[]arr=s.split(“(?这永远不会起作用。它永远不会正确处理括号、运算符优先级或一元运算符。将它们全部扔掉,然后使用标准表达式解析器或下面建议的脚本引擎。您的任务是创建自己的解析器吗(因此正则表达式和javascript求值等内容超出范围)?如果你先把它转换成整数,那就容易多了。