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求值等内容超出范围)?如果你先把它转换成整数,那就容易多了。