本算法用java代码实现数值表达式的解析。
1、数值表达式的组成:
- 数字
- 运算符+、-、*、/、^、%、=
- 圆括号(、)
- 变量
其中^运算符表示求幂运算符(如10^2=100),=是赋值运算符。
2、本解析器必须满足的约束条件:
1)、所有变量都是单个字母(从A到Z的26个字母),字母不区分大小;
2)、假定所有的数字都是double类型,可以方便地修改解析器从而处理其他类型的值。
3、该算法将表达式被视为递归的数据结构,表达式定义的规则:
表达式-->项 [+项] [-项]
项-->因数 [*因数] [/因数]
因数-->变量、数字或者表达式
4、表达式的分解
例如表达式:A * B - (C + 10)
包括如下这些独立的元素:A、*、B、-、(、C、+、10、),这些元素叫做标识符(token),表示表达式中一个不可再分的独立单元。
5、代码
异常处理类:
- <span style="font-size:16px;"><span style="font-family:'Microsoft YaHei';">package com.mmq.expression;
-
- public class ParserException extends Exception {
- private static final long serialVersionUID = 8930730209321088339L;
- String errStr;
-
- public ParserException(String str) {
- this.errStr = str;
- }
-
- public String toString() {
- return errStr;
- }
- }
- </span></span>
测试代码:
- <span style="font-size:16px;"><span style="font-family:'Microsoft YaHei';">package com.mmq.expression;
-
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
-
- public class ParserDemo {
- 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("".equals(expr)){
- break;
- }
- try {
- System.out.println("Result: " + p.evaluate(expr));
- System.out.println();
- } catch (ParserException e) {
- System.out.println(e);
- }
- }
- }
- }
- </span></span>
测试输出如下:Enter an empty expression to stop.
Enter expression: a=10
Result: 10.0
Enter expression: b=5
Result: 5.0
Enter expression: a+(b-2)/3-5
Result: 6.0
Enter expression: