本算法用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: