请教一个算法,如何判断一个算术表达式是正确的输入??谢谢 这个问题好像不是简单的用正则表达式能解决的。如果自己写程序,一百行的代码不一定能解决直觉使用Stack处理括号问题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用编译的语法分析要简单一些E->E+T|T|0T->T*F|F|0F->id|(E)|0使用几个类就可以了 以前用过一个MathExpression的类(非标准类),你可以google一下试试看 有一个投机取巧的方法,你可以将输入交给现成的算术表达式包处理,看看有没有出错。我用过一个算术表达式包JEP,下载下来后可用如下方法使用:JEP parser = new JEP();parser.parse(表达式);parser.getErrorInfo(); // 调用该函数看看有没有出错 JEP该可以http://www.singularsys.com/jep/用编译原理中的递归下降分析算法自己写也可以,这个算法不复杂,可看看书我这有个整型计算器,C代码的,改成JAVA很容易,要加小数支持就麻烦点了,给你参考/* Simple integer arithmetic calculator according to the EBNF: <exp> -> <term> { <addop> <term> } <addop> -> + | - <term> -> <factor> { <mulop> <factor> } <mulop> -> * <factor> -> ( <exp> ) | Number Inputs a line of text from stdin Outputs "Error" or the result.*/#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <ctype.h>char token; /*global token variable *//* function prototypes for recursive calls */int exp(void);int term(void);int factor(void);void error(void){ fprintf(stderr, "Error\n"); exit(1);}void match( char expectedToken ){ if(token == expectedToken) token = getchar(); else error();}main(){ int result; token = getchar(); /* load token with first charactor for lookahead */ result = exp(); if(token == '\n') /*check for end of line */ printf("Result = %d\n", result); else error(); /* extraneous chars on line */ return 0;}int exp(void){ int temp = term(); while( (token == '+') || (token == '-') ) switch(token) { case '+': match('+'); temp += term(); break; case '-': match('-'); temp -= term(); break; } return temp;}int term(void){ int temp = factor(); while(token == '*') { match('*'); temp *= factor(); } return temp;}int factor(void){ int temp; if(token == '(') { match('('); temp = exp(); match(')'); } else if(isdigit(token)) { ungetc(token, stdin); scanf("%d", &temp); token = getchar(); } else error(); return temp;} 如何将图像变成字符 java 读取txt去掉重复和空行 Java 浏览网页停留的随机时间要怎么实现 菜鸟的几个问题,高人和好心人请进 反射 array length问题 JAVA SQL为什么连接没open??? java 程序 请问为何运行窗口后不能看到组件? 关于jdbc的怪问题,谁能帮我解决一下 MS SQL Server的时间戳(timestamp),在java中应该是什么数据类型? 【讨论醒目】我出100分,请大家进来讨论讨论synchronized后分别跟this和*.class的代码段有何异同。up有分
E->E+T|T|0
T->T*F|F|0
F->id|(E)|0
使用几个类就可以了
我用过一个算术表达式包JEP,下载下来后可用如下方法使用:
JEP parser = new JEP();
parser.parse(表达式);
parser.getErrorInfo(); // 调用该函数看看有没有出错
http://www.singularsys.com/jep/用编译原理中的递归下降分析算法自己写也可以,这个算法不复杂,可看看书我这有个整型计算器,C代码的,改成JAVA很容易,要加小数支持就麻烦点了,给你参考/* Simple integer arithmetic calculator
according to the EBNF: <exp> -> <term> { <addop> <term> }
<addop> -> + | -
<term> -> <factor> { <mulop> <factor> }
<mulop> -> *
<factor> -> ( <exp> ) | Number Inputs a line of text from stdin
Outputs "Error" or the result.
*/
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>char token; /*global token variable *//* function prototypes for recursive calls */
int exp(void);
int term(void);
int factor(void);void error(void)
{
fprintf(stderr, "Error\n");
exit(1);
}void match( char expectedToken )
{
if(token == expectedToken) token = getchar();
else error();
}main()
{
int result;
token = getchar(); /* load token with first charactor for lookahead */ result = exp();
if(token == '\n') /*check for end of line */
printf("Result = %d\n", result);
else error(); /* extraneous chars on line */
return 0;
}int exp(void)
{
int temp = term();
while( (token == '+') || (token == '-') )
switch(token)
{
case '+':
match('+');
temp += term();
break;
case '-':
match('-');
temp -= term();
break;
} return temp;
}int term(void)
{
int temp = factor();
while(token == '*')
{
match('*');
temp *= factor();
} return temp;
}int factor(void)
{
int temp;
if(token == '(')
{
match('(');
temp = exp();
match(')');
}
else if(isdigit(token))
{
ungetc(token, stdin);
scanf("%d", &temp);
token = getchar();
}
else error();
return temp;
}