TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
一个简单的表达式解析器,这个解析器可以计算仅由数字、运算符和括号组成的表达式的值。
下面是演示这个解析器的代码:
import java.io.*;
class PDemo {
public static void main(String args[])
throws IOException
{
String expr;
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
Parser p = new Parser();
System.out.println("Enter an empty expression to stop.");
for(;;) {
System.out.print("Enter expression: ");
expr = br.readLine(); //从命令行输入表达式
if(expr.equals("")) break;
try {
System.out.println("Result: " + p.evaluate(expr)); //计算表达式的值并输出
System.out.println();
} catch (ParserException exc) {
System.out.println(exc);
}
}
}
}
运行结果:
C:java>java PDemo
Enter an empty expression to stop.
Enter expression: 3+7*9
Result: 66.0
Enter expression: (2+3)-7*9
Result: -58.0
Enter expression:
C:java>
附解析器源码:
/*
不能处理变量的递归下降的表达式解析器
*/
// 处理错误的异常类
class ParserException extends Exception {
String errStr; // describes the error
public ParserException(String str) {
errStr = str;
}
public String toString() {
return errStr;
}
}
class Parser {
// 标识符的类型
final int NONE = 0;
final int DELIMITER = 1; //分隔符:+、-、*、/、%、^、=、()
final int VARIABLE = 2; //变量
final int NUMBER = 3; //数字
// 这些的语法错误的类型
final int SYNTAX = 0; //表达式不正确
final int UNBALPARENS = 1; //括号不对称
final int NOEXP = 2; //没有表达式
final int DIVBYZERO = 3; //被零除
// 这个标识符表示表达式结束
final String EOE = " |
|