亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? expressionparser.java

?? 計算輸入公式 字符轉換器 例如(A+B)*c的值等
?? JAVA
字號:

/**
 * 文件名ExpressionParser.java
 */
import java.io.*;

/** *//**
 * 表達式解析器
 * @author joe
 *
 */
public class ExpressionParser {
    //4種標記類型
    public static final int NONE_TOKEN = 0;    //標記為空或者結束符
    public static final int DELIMITER_TOKEN = 1;    //標記為分隔符
    public static final int VARIABLE_TOKEN = 2;    //標記為變量
    public static final int NUMBER_TOKEN = 3;    //標記為數字
    
    //4種錯誤類型
    public static final int SYNTAX_ERROR = 0;    //語法錯誤
    public static final int UNBALPARENS_ERROR = 1;    //括號沒有結束錯誤
    public static final int NOEXP_ERROR = 2;    //表達式為空錯誤
    public static final int DIVBYZERO_ERROR = 3;    //被0除錯誤
    
    //針對4種錯誤類型定義的4個錯誤提示
    public static final String[] ERROR_MESSAGES = {"Syntax Error", "Unbalanced " +
            "Parentheses", "No Expression Present", "Division by Zero"};
    
    //表達式的結束標記
    public static final String EOE = "\0";
 
 private String exp; //表達式字符串
 private int expIndex; //解析器當前指針在表達式中的位置
 private String token; //解析器當前處理的標記
 private int tokenType; //解析器當前處理的標記類型
 private double[] vars = new double[26]; //變量數組
 /**
  * 
  */
 public ExpressionParser() {
 }
 
 /**
  * 解析一個表達式,返回表達式的值
  */
 public double evaluate(String expStr) throws Exception {
  double result;
  this.exp = expStr;
  this.expIndex = 0;
  
  //獲取第一個標記
  this.getToken();
  if (this.token.equals(EOE)) {
   //沒有表達式異常
   this.handleError(NOEXP_ERROR);
  }
  
  result = this.parseAssign(); //處理賦值語句
  //處理完賦值語句,應該就是表達式結束符,如果不是,則返回異常
  if(!this.token.equals(EOE)) {
   this.handleError(SYNTAX_ERROR);
  }
  return result;
 }
 
 /**
  * 處理賦值語句
  */
 public double parseAssign() throws Exception {
  double result; //結果
  int varIndex; //變量下標
  String oldToken; //舊標記
  int oldTokenType; //舊標記的類型
  
  //如果標記類型是變量
  if (this.tokenType == VARIABLE_TOKEN) {
   //保存當前標記
   oldToken = new String(this.token);
   oldTokenType = this.tokenType;
   //取得變量的索引,本解析器只支持一個字母的變量
   //如果用戶的變量字母長度大于1,則取第一個字母當作變量
   varIndex = Character.toUpperCase(this.token.charAt(0)) - 'A';
   
   //獲得下一個標記
   this.getToken();
   //如果當前標記不是等號=
   if(!this.token.equals("=")) {
    this.putBack(); //回滾
    //不是一個賦值語句,將標記恢復到上一個標記
    this.token = new String(oldToken);
    this.tokenType = oldTokenType;
   } else {
    //如果當前標記是等號=,即給變量賦值,形式如:a = 3 + 5;
    //則計算等號后面表達式的值,然后再將得到的值賦給變量
    this.getToken();
    //因為加減法的優先級最低,所以計算加減法表達式
    result = this.parseAddOrSub();
    //將表達式的值賦給變量,并存在實例變量vars中
    this.vars[varIndex] = result;
    return result;
   }
  }
  //如果當前標記類型不是變量,或者不是賦值語句,則用加減法計算表達式的值
  return this.parseAddOrSub();
 }
 
 /** 計算加減法表達式 */
 private double parseAddOrSub() throws Exception {
  char op; //運算符
  double result; //結果
  double partialResult; //子表達式的結果
  
  result = this.pareseMulOrDiv(); //用乘除法計算當前表達式的值
  //如果當前標記的第一個字母是加減號,則繼續進行加減運算
  while ((op = this.token.charAt(0)) == '+' || op == '-') {
   this.getToken(); //取下一個標記
   //用乘除法計算當前子表達式的值
   partialResult = this.pareseMulOrDiv();
   switch(op) {
   case '-':
    //如果是減法,則用已處理的子表達式的值減去當前子表達式的值
    result = result - partialResult;
    break;
   case '+':
    //如果是加法,用已處理的子表達式的值加上當前子表達式的值
    result = result + partialResult;
    break;
   }
  }
  return result;
 }
 /**
  * 計算乘除法表達式,包括取模運算
  */
 private double pareseMulOrDiv() throws Exception {
  char op; //運算符
  double result; //結果
  double partialResult; //子表達式結果
  //用指數運算計算當前子表達式的值
  result = this.parseExponent();
  //如果當前標記的第一個字母是乘、除或者取模運算,則繼續進行乘除法運算
  while ((op = this.token.charAt(0)) == '*' || op == '/' || op == '%') {
   this.getToken(); //取下一標記
   //用指數運算計算當前子表達式的值
   partialResult = this.parseExponent();
   switch (op) {
   case '*':
    //如果是乘法,則用已處理子表達式的值乘以當前子表達式的值
    result = result * partialResult;
    break;
   case '/':
    //如果是除法,判斷當前字表達式的值是否為0,如果為0,則拋出被0除異常
    if(partialResult == 0.0) {
     this.handleError(DIVBYZERO_ERROR);
    }
    //除數不為0,則進行除法運算
    result = result / partialResult;
    break;
   case '%':
    //如果是取模運算,也要判斷當前子表達式的值是否為0
    if(partialResult == 0.0) {
     this.handleError(DIVBYZERO_ERROR);
    }
    result = result % partialResult;
    break;
   }
  }
  return result;
 }
 
 /**
  * 計算指數表達式
  */
 private double parseExponent() throws Exception {
  double result; //結果
  double partialResult; //子表達式的值
  double ex; //指數的底數
  int t; //指數的冪
  
  //用一元運算計算當前子表達式的值(底數)
  result = this.parseUnaryOperator();
  //如果當前標記為“^”,則為指數運算
  if (this.token.equals("^")) {
   //獲取下一標記,即獲得指數的冪
   this.getToken();
   partialResult = this.parseExponent();
   ex = result;
   if(partialResult == 0.0) {
    //如果指數的冪為0,則指數的值為1
    result = 1.0;
   } else {
    //否則,指數的值為個數為指數冪的底數相乘的結果
    for (t = (int) partialResult - 1; t > 0; t--) {
     result =result * ex;
    }
   }
  }
  return result;
 }
 
 /**
  * 計算一元運算,+,-,表示正數和負數 
  */
 private double parseUnaryOperator() throws Exception{
  double result; //結果
  String op; //運算符
  op = "";
  //如果當前標記類型為分隔符,而且分隔符的值等于+或者-
  if((this.tokenType == DELIMITER_TOKEN) && this.token.equals("+") || this.token.equals("-")) {
   op = this.token;
   this.getToken();
  }
  //用括號運算計算當前子表達式的值
  result = this.parseBracket();
  if(op.equals("-")) {
   //如果運算符為-,則表示負數,將子表達式的值變為負數
   result = -result;
  }
  return result;
 }
 
 /**
  * 計算括號運算
  */
 private double parseBracket() throws Exception {
  double result; //結果
  //如果當前標記為左括號,則表示是一個括號運算
  if (this.token.equals("(")) {
   this.getToken(); //取下一標記
   result = this.parseAddOrSub(); //用加減法運算計算子表達式的值
   //如果當前標記不等于右括號,拋出括號不匹配異常
   if (!this.token.equals(")")) {
    this.handleError(UNBALPARENS_ERROR);
   }
   this.getToken(); //否則取下一個標記
  } else {
   //如果不是左括號,表示不是一個括號運算,則用原子元素運算計算子表達式值
   result = this.parseAtomElement();
  }
  return result;
 }
 
 /**
  * 計算原子元素運算,包括變量和數字 
  */
 private double parseAtomElement() throws Exception {
  double result = 0.0; //結果
  
  switch(this.tokenType) {
  case NUMBER_TOKEN:
   //如果當前標記類型為數字
   try {
    //將數字的字符串轉換成數字值
    result = Double.parseDouble(this.token);
   } catch (NumberFormatException exc) {
    this.handleError(SYNTAX_ERROR);
   }
   this.getToken(); //取下一個標記
   break;
  case VARIABLE_TOKEN:
   //如果當前標記類型是變量,則取變量的值
   result = this.findVar(token);
   this.getToken();
   break;
  default:
   this.handleError(SYNTAX_ERROR);
   break;
  }
  return result;
 }
 
 /**
  * 根據變量名獲取變量的值,如果變量名長度大于1,則只取變量的第一個字符 
  */
 private double findVar(String vname) throws Exception {
  if (!Character.isLetter(vname.charAt(0))) {
   this.handleError(SYNTAX_ERROR);
   return 0.0;
  }
  //從實例變量數組vars中取出該變量的值
  return vars[Character.toUpperCase(vname.charAt(0)) - 'A'];
 }
 
 /** 
  * 回滾,將解析器當前指針往前移到當前標記位置
  */
 private void putBack() {
  if (this.token == EOE) {
   return;
  }
  //解析器當前指針往前移動
  for (int i = 0; i < this.token.length(); i++ ){
   this.expIndex--;
  }
 }
 
 /**
  * 處理異常情況
  */
 private void handleError(int errorType) throws Exception {
  //遇到異常情況時,根據錯誤類型,取得異常提示信息,將提示信息封裝在異常中拋出
  throw new Exception(ERROR_MESSAGES[errorType]);
 }
 
 /**
  * 獲取下一個標記
  */
 private void getToken() {
  //設置初始值
  this.token = "";
  this.tokenType = NONE_TOKEN;
  
  //檢查表達式是否結束,如果解析器當前指針已經到達了字符串長度,
  //則表明表達式已經結束,置當前標記的值為EOE
  if(this.expIndex == this.exp.length()) {
   this.token = EOE;
   return;
  }
  
  //跳過表達式中的空白符
  while (this.expIndex < this.exp.length() 
    && Character.isWhitespace(this.exp.charAt(this.expIndex))) {
   ++this.expIndex;
  }
  
  //再次檢查表達式是否結束
  if (this.expIndex == this.exp.length()) {
   this.token = EOE;
   return;
  }
  
  //取得解析器當前指針指向的字符
  char currentChar = this.exp.charAt(this.expIndex);
  //如果當前字符是一個分隔符,則認為這是一個分隔符標記
  //給當前標記和標記類型賦值,并將指針后移
  if(isDelim(currentChar)) {
   this.token += currentChar;
   this.expIndex++;
   this.tokenType = DELIMITER_TOKEN;
  } else if (Character.isLetter(currentChar)) {
   //如果當前字符是一個字母,則認為是一個變量標記
   //將解析器指針往后移,知道遇到一個分隔符,之間的字符都是變量的組成部分
   while(!isDelim(currentChar)) {
    this.token += currentChar;
    this.expIndex++;
    if(this.expIndex >= this.exp.length()) {
     break;
    } else {
     currentChar = this.exp.charAt(this.expIndex);
    }
   }
   this.tokenType = VARIABLE_TOKEN; //設置標記類型為變量
  } else if (Character.isDigit(currentChar)) {
   //如果當前字符是一個數字,則認為當前標記的類型為數字
   //將解析器指針后移,知道遇到一個分隔符,之間的字符都是該數字的組成部分
   while(!isDelim(currentChar)) {
    this.token += currentChar;
    this.expIndex++;
    if (this.expIndex >= this.exp.length()) {
     break;
    } else {
     currentChar = this.exp.charAt(this.expIndex);
    }
   }
   this.tokenType = NUMBER_TOKEN; //設置標記類型為數字
  } else {
   //無法識別的字符,則認為表達式結束
   this.token = EOE;
   return;
  }
 }
 
 /**
  * 判斷一個字符是否為分隔符
  * 表達式中的字符包括:
  * 加“+”、減“-”、乘“*”、除“/”、取模“%”、指數“^”、賦值“=”、左括號“(”、右括號“)”
  */
 private boolean isDelim(char c) {
  if (("+-*/%^=()".indexOf(c) != -1))
   return true;
  return false;
 }
 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  ExpressionParser test = new ExpressionParser();
  
/*  String exp1 = "a = 5.0";
  System.out.println("exp1(\"a = 5.0\") = " + test.evaluate(exp1));
  
  String exp2 = "b = 3.0";
  System.out.println("exp2(\"b = 3.0\") = " + test.evaluate(exp2));
  
  String exp3 = "(a + b) * (a - b)";
  System.out.println("exp3(\"(a + b) * (a - b)\") = " + test.evaluate(exp3));
  
  String exp4 = "3*5-4/2";
  System.out.println("exp4(\"3*5-4/2\") = " + test.evaluate(exp4));
  
  String exp5 = "(4-2) * ((a + b) / (a - b))";
  System.out.println("exp5(\"(4 - 2) * ((a + b) / (a - b))\") = " + test.evaluate(exp5));
  
  String exp6 = "5 % 2";
  System.out.println("exp6(\"5 % 2\") = " + test.evaluate(exp6));
  
  String exp7 = "3^2 * 5 + 4";
  System.out.println("exp7(\"3^2 * 5 + 4\") = " + test.evaluate(exp7));*/
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  for(;;) 
     { 
	  System.out.print("Enter expression: "); 
	  String expr = br.readLine();
	  if(expr.equals("")) break; 
	  System.out.println("Result: " + test.evaluate(expr)); 
	  System.out.println(); 
	  } 


 }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
自拍av一区二区三区| 欧美日韩日本视频| 欧美激情一区二区三区蜜桃视频 | 欧美色网站导航| 亚洲成人手机在线| 91精品黄色片免费大全| 日本欧美一区二区| 久久先锋资源网| 国产成人8x视频一区二区| 国产欧美日韩亚州综合| 成人美女视频在线观看18| 亚洲欧美日韩一区| 欧美久久久久中文字幕| 亚洲不卡一区二区三区| 日韩美女天天操| 国产激情一区二区三区| 亚洲丝袜制服诱惑| 欧美日韩国产另类一区| 国产在线国偷精品免费看| 国产精品免费视频网站| 欧美日韩一区中文字幕| 看电视剧不卡顿的网站| 中文字幕欧美一| 制服丝袜亚洲精品中文字幕| 国产福利精品一区二区| 亚洲一级二级在线| 日韩视频一区二区| 99久久777色| 美女一区二区三区| 亚洲欧美韩国综合色| 日韩一级免费观看| 成人综合婷婷国产精品久久| 亚洲成人综合在线| 国产天堂亚洲国产碰碰| 欧美日韩在线三级| 国产激情精品久久久第一区二区| 亚洲国产综合在线| 国产精品美女久久久久久久| 8x8x8国产精品| 白白色 亚洲乱淫| 免费看欧美美女黄的网站| 亚洲三级免费电影| 日韩精品一区二区三区老鸭窝| 91麻豆国产福利在线观看| 精品一区二区三区蜜桃| 亚洲一二三四区不卡| 国产精品免费丝袜| 久久综合av免费| 日韩视频一区二区三区在线播放| 色婷婷一区二区| 国产精品香蕉一区二区三区| 日韩国产欧美三级| 亚洲一区二区三区自拍| 亚洲国产精品99久久久久久久久| 日韩美女一区二区三区四区| 欧美日韩国产一级| 91蝌蚪国产九色| 国产iv一区二区三区| 久色婷婷小香蕉久久| 婷婷成人激情在线网| 亚洲激情在线激情| 亚洲欧洲av色图| 国产精品久久一级| 国产欧美一区在线| 日韩精品资源二区在线| 欧美肥胖老妇做爰| 欧美日韩一级视频| 欧美日本视频在线| 91成人在线精品| 91久久精品一区二区三区| av男人天堂一区| 成人app软件下载大全免费| 国产在线乱码一区二区三区| 美女尤物国产一区| 久久电影网电视剧免费观看| 日韩中文字幕一区二区三区| 香蕉影视欧美成人| 亚洲成人先锋电影| 天天操天天干天天综合网| 天天爽夜夜爽夜夜爽精品视频| 亚洲一二三级电影| 日韩激情在线观看| 久久精品99国产精品日本| 麻豆久久久久久| 国产精品18久久久久久久久| 国产乱一区二区| 99久久国产综合精品色伊| 99久久久久久| 欧美午夜精品久久久久久超碰 | 91精品国产综合久久精品app| 欧美视频一区二区三区四区 | 国产一区二区三区蝌蚪| 国产高清精品久久久久| 成人av片在线观看| 在线观看欧美精品| 欧美一级免费观看| 91在线视频免费观看| 日本高清无吗v一区| 欧美久久久一区| 精品成人一区二区三区四区| 国产午夜亚洲精品午夜鲁丝片| 国产精品福利在线播放| 亚洲va韩国va欧美va精品| 蜜桃视频免费观看一区| 国产成人高清视频| 在线免费一区三区| 日韩一区二区电影在线| 中文字幕国产一区| 亚洲国产cao| 国产精品99久久久久| 日本精品裸体写真集在线观看| 91精品国产麻豆国产自产在线| 久久久天堂av| 亚洲国产日韩a在线播放性色| 精品一区二区三区av| 91免费精品国自产拍在线不卡| 欧美另类videos死尸| 国产日韩高清在线| 亚洲午夜久久久久久久久电影网 | 国产999精品久久久久久| 91免费国产在线观看| 日韩美女主播在线视频一区二区三区| 国产欧美在线观看一区| 午夜精品在线视频一区| 国产成人啪午夜精品网站男同| 91年精品国产| 欧美电影免费观看高清完整版 | 国产区在线观看成人精品| 一区二区免费看| 国产麻豆欧美日韩一区| 欧美日韩激情一区| 国产精品―色哟哟| 加勒比av一区二区| 欧美日韩亚洲综合| 综合欧美亚洲日本| 国产酒店精品激情| 91精品国产一区二区三区| 中文字幕日韩一区| 粉嫩一区二区三区性色av| 91麻豆精品国产无毒不卡在线观看| 中文字幕在线视频一区| 国内精品自线一区二区三区视频| 欧美主播一区二区三区美女| 欧美高清在线一区| 国产一本一道久久香蕉| 欧美一级黄色片| 丝袜美腿亚洲综合| 欧美三级在线播放| 亚洲一区二区在线免费观看视频| av不卡在线播放| 国产亚洲美州欧州综合国| 美国欧美日韩国产在线播放| 精品视频1区2区3区| 亚洲精品国产a久久久久久| 成人理论电影网| 欧美国产日本视频| 国产mv日韩mv欧美| 欧美激情资源网| 国产.欧美.日韩| 国产婷婷精品av在线| 国产精品一二三四五| 精品国产乱码久久久久久1区2区| 青青草国产精品97视觉盛宴| 91精品中文字幕一区二区三区| 亚洲午夜视频在线| 欧美日韩另类一区| 日本最新不卡在线| 欧美精品成人一区二区三区四区| 亚洲在线视频网站| 欧美日韩亚洲另类| 视频一区欧美精品| 日韩欧美中文一区二区| 久久99久久99| 欧美精品一区二| 国产a精品视频| 亚洲欧美色图小说| 在线观看不卡一区| 五月激情综合色| 日韩欧美的一区二区| 极品少妇xxxx精品少妇偷拍| 久久久www免费人成精品| 国产精选一区二区三区| 国产日韩欧美精品综合| 成人精品一区二区三区中文字幕| 亚洲欧美日韩久久| 欧美日精品一区视频| 日韩福利视频网| 久久免费午夜影院| youjizz久久| 午夜av电影一区| 久久久久久久综合| 91最新地址在线播放| 五月婷婷综合网| 久久日韩精品一区二区五区| av中文一区二区三区| 亚洲高清视频在线| 精品国产一区二区三区久久影院| 成人午夜免费视频| 亚洲成人av电影在线| 欧美成人三级在线|