*******哪位大虾有对表达式进行解析的类?****** 有一个现成的,非常好用:JavaCC(JavaCC Java Compiler Compiler),纯JAVA的词法分析生成器,功能十分强大,可以用来编写编译器的。可以免费下载使用:http://www.webgain.com/products/java_cc/ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 JavaCC会根据你给出的EBNF描述,自动生成词法分析程序和语法分析程序。====================第一步,你要用EBNF描述出你的语法形式,比如expr := number | expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | '(' expr ')' | - exprnumber := digit+ ('.' digit+)?digit := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'====================第二步,要将EBNF转译成JavaCC约定的格式,比如options{ LOOKAHEAD=2;}PARSER_BEGIN(Calculator)public class Calculator{ public static void main(String args[]) throws ParseException { Calculator parser = new Calculator(System.in); while (true) { parser.parseOneLine(); } }}PARSER_END(Calculator)SKIP :{ " "| "\r"| "\t"}TOKEN:{ < NUMBER: (<DIGIT>)+ ( "." (<DIGIT>)+ )? >| < DIGIT: ["0"-"9"] >| < EOL: "\n" >}void parseOneLine():{ double a;}{ a=expr() <EOL> { System.out.println(a); } | <EOL> | <EOF> { System.exit(-1); }}double expr():{ double a; double b;}{ a=term() ( "+" b=expr() { a += b; } | "-" b=expr() { a -= b; } )* { return a; }}double term():{ double a; double b;}{ a=unary() ( "*" b=term() { a *= b; } | "/" b=term() { a /= b; } )* { return a; }}double unary():{ double a;}{ "-" a=element() { return -a; }| a=element() { return a; }}double element():{ Token t; double a;}{ t=<NUMBER> { return Double.parseDouble(t.toString()); }| "(" a=expr() ")" { return a; }}注意看,里面有测试用的代码。:)将其保存为一个文件,后缀为*.jj,比如ABC.jj。====================第三步,用JavaCC将*.jj文件“编译”成java程序javacc ABC.jjJavaCC会自动成生一系列的文件TokenMgrError.javaParseException.javaToken.javaASCII_CharStream.javaABC.javaABCConstants.javaABCTokenManager.java====================第四步,编译这些源文件,然后执行ABC.class。javac *.javajava ABC 一切OK。 有关java中解压zip的问题 我想删除一个文件中的一部份内容,请问此处该如何进行操作? 请前辈们指教 请问一个java的基本问题 java里类似于 StringList的东西在哪? rs.getString为什么返回0xE689B................. application和APPLET的移植 java 线程,对当前线程(非主线程)调用sleep,为什么主线程(窗口)也没反应了 类的问题 怎样得知db2数据库的端口号? 请问如何设置Frame的背景图片? 更新数据库的字段值,为什么总是为乱码?
第一步,你要用EBNF描述出你的语法形式,比如expr := number
| expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '(' expr ')'
| - expr
number := digit+ ('.' digit+)?
digit := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
====================
第二步,要将EBNF转译成JavaCC约定的格式,比如options
{
LOOKAHEAD=2;
}PARSER_BEGIN(Calculator)public class Calculator
{
public static void main(String args[]) throws ParseException
{
Calculator parser = new Calculator(System.in);
while (true)
{
parser.parseOneLine();
}
}
}PARSER_END(Calculator)SKIP :
{
" "
| "\r"
| "\t"
}TOKEN:
{
< NUMBER: (<DIGIT>)+ ( "." (<DIGIT>)+ )? >
| < DIGIT: ["0"-"9"] >
| < EOL: "\n" >
}void parseOneLine():
{
double a;
}
{
a=expr() <EOL> { System.out.println(a); }
| <EOL>
| <EOF> { System.exit(-1); }
}double expr():
{
double a;
double b;
}
{
a=term()
(
"+" b=expr() { a += b; }
| "-" b=expr() { a -= b; }
)*
{ return a; }
}double term():
{
double a;
double b;
}
{
a=unary()
(
"*" b=term() { a *= b; }
| "/" b=term() { a /= b; }
)*
{ return a; }
}double unary():
{
double a;
}
{
"-" a=element() { return -a; }
| a=element() { return a; }
}double element():
{
Token t;
double a;
}
{
t=<NUMBER> { return Double.parseDouble(t.toString()); }
| "(" a=expr() ")" { return a; }
}
注意看,里面有测试用的代码。:)
将其保存为一个文件,后缀为*.jj,比如ABC.jj。
====================
第三步,用JavaCC将*.jj文件“编译”成java程序javacc ABC.jjJavaCC会自动成生一系列的文件
TokenMgrError.java
ParseException.java
Token.java
ASCII_CharStream.java
ABC.java
ABCConstants.java
ABCTokenManager.java
====================
第四步,编译这些源文件,然后执行ABC.class。javac *.java
java ABC 一切OK。