计算器后台逻辑实现——表达式分析器
2014-03-02 17:32
357 查看
public 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; //unbalparens final int NOEXP = 2; final int DIVBYZERO = 3; final String EOE = "\0"; private String exp; private int expIdx; private String token; private int tokType; public double evaluate(String expstr) throws ParserException { double result; exp = expstr; expIdx = 0; getToken(); if(token.equals(EOE)) handleError(NOEXP); result = evalExp2(); if(!token.equals(EOE)) handleError(SYNTAX); return result; } private double evalExp2() throws ParserException { char op; double result; double partialResult; result = evalExp3(); while ((op=token.charAt(0))=='+' || op=='-') { getToken(); partialResult = evalExp3(); switch(op) { case '-': result = result - partialResult; break; case '+': result = result + partialResult; break; } } return result; } private double evalExp3() throws ParserException { char op; double result; double partialResult; result = evalExp4(); while((op=token.charAt(0))=='*'||op=='/'||op=='%'){ getToken(); partialResult = evalExp4(); switch(op){ case '*': result = result * partialResult; break; case '/': if(partialResult ==0.0) handleError(DIVBYZERO); result = result / partialResult; break; case '%': if(partialResult == 0.0) handleError(DIVBYZERO); result = result % partialResult; break; } } return result; } private double evalExp4() throws ParserException { double result; double partialResult; double ex; int t; result = evalExp5(); if(token.equals("^")){ getToken(); partialResult = evalExp4(); ex = result; if (partialResult == 0.0){ result = 1.0; } else { for (t=(int)partialResult-1;t>0;t--) result = result * ex; } } return result; } private double evalExp5() throws ParserException { double result; String op; op=""; if((tokType==DELIMITER)&& token.equals("+")||token.equals("-")) { op = token; getToken(); } result = evalExp6(); if(op.equals("-")) result = -result; return result; } private double evalExp6() throws ParserException { double result=0.0; if(token.equals("(")){ getToken(); result = evalExp2(); if(!token.equals(")")) handleError(UNBALPARENS); getToken(); } else result = atom(); return result; } private double atom() throws ParserException { double result = 0.0; switch(tokType) { case NUMBER: try { result = Double.parseDouble(token); }catch (NumberFormatException exc) { handleError(SYNTAX); } getToken(); break; default: handleError(SYNTAX); break; } return result; } private void handleError(int error) throws ParserException { String[] err = { "Syntax Error", "Unbalanced Parentheses", "No Expression Present", "Division by Zero" }; throw new ParserException(err[error]); } private void getToken() { tokType = NONE; token = ""; if (expIdx == exp.length()){ token = EOE; return; } while (expIdx < exp.length() && Character.isWhitespace(exp.charAt(expIdx))) ++expIdx; if(expIdx == exp.length()){ token = EOE; return; } if (isDelim(exp.charAt(expIdx))) { token += exp.charAt(expIdx); expIdx++; tokType = DELIMITER; } else if (Character.isLetter(exp.charAt(expIdx))){ while(!isDelim(exp.charAt(expIdx))){ token += exp.charAt(expIdx); expIdx++; if(expIdx>=exp.length()) break; } tokType = VARIABLE; } else if (Character.isDigit(exp.charAt(expIdx))){ while(!isDelim(exp.charAt(expIdx))){ token+=exp.charAt(expIdx); expIdx++; if(expIdx>=exp.length()) break; } tokType = NUMBER; } else { token = EOE; return; } } private boolean isDelim(char c){ if ((" +-/*%^=()").indexOf(c)!= -1) return true; return false; } }
相关文章推荐
- 后缀表达式的计算器Java实现
- 分享一个Swift语言的逆波兰表达式计算器的实现
- Python 正则表达式实现计算器功能
- Python利用正则表达式实现计算器算法思路解析
- 后缀表达式的计算器Java实现
- Redis实现微博后台业务逻辑系列(一)
- Redis实现微博后台业务逻辑系列(三)
- 后缀表达式的计算器Java实现
- asp.net 实现在后台写正则表达式判断
- Redis实现微博后台业务逻辑系列(六)
- 【计算器Java实现】基于栈的复杂表达式解析&&数值计算
- 后缀表达式的计算器Java实现
- 表达式计算的代码实现,按照前面两篇文章的逻辑步骤实现
- [ Python - 6 ] 正则表达式实现计算器功能
- 利用正则表达式实现计算器功能
- 后缀表达式的计算器Java实现
- C# 实现带括号的逻辑表达式的自动判定(与或非)
- 后缀表达式的计算器Java实现
- 1位的二选一多路选择器的逻辑表达式实现
- 利用自定义ClassLoader和接口逻辑后台可刷新缓存实现java-web项目的动态发布