package lipeng.stringdemo;
/*** 乙個簡單的表示式解析器,這個解析器可以計算由數字、運算子和括號組成的表示式的值,並能處理變數,
* 為了處理簡單,本解析器只支援乙個字母的變數,不區分變數字母的大小寫。因此,最多只能儲存26個變數。
* 如果使用者的變數名長度大於乙個字母,則只取第乙個字母當作變數。
*/public class expressionparser ;
/** 表示式的結束標記*/
public static final string eoe = "/0";
/** 表示式字串*/
private string exp;
/** 解析器當前指標在表示式中的位置*/
private int expindex;
/** 解析器當前處理的標記*/
private string token;
/** 解析器當前處理標記的型別*/
private int tokentype;
/** 變數的陣列*/
private double vars = new double[26];
/*** 解析乙個表示式,返回表示式的值。
* @param expstr 表示式字串
* @return
* @throws exception
*/
public double evaluate(string expstr) throws exception
//處理賦值語句
result = this.parseassign();
//處理完賦值語句,應該就是表示式結束符,如果不是,則返回異常
if (!this.token.equals(eoe))
return result;
}/**
* 處理賦值語句
*/
private double parseassign() throws exception else
}//如果當前標記型別不是變數,或者不是賦值語句,則用加減法計算表示式的值。
return this.parseaddorsub();
}/**
* 計算加減法表示式
*/ private double parseaddorsub() throws exception
}return result;
}/**
* 計算乘除法表示式,包括取模運算
*/ private double parsemulordiv() throws exception
//除數不為0,則進行除法運算
result = result / partialresult;
break;
case '%':
//如果是取模運算,也要判斷當前子表示式的值是否為0
//如果為0,則丟擲被0除異常
if (partialresult == 0.0)
//進行取模運算
result = result % partialresult;
break;}}
return result;
}/**
* 計算指數表示式
* @throws exception
*/
private double parseexponent() throws exception else }}
return result;
}/**
* 計算一元運算,+,-,表示正數和複數
*/
private double parseunaryoperator() throws exception
//用括號運算計算當前子表示式的值
result = this.parsebracket();
if (op.equals("-"))
return result;
}/**
* 計算括號運算
*/
private double parsebracket() throws exception
//否則取下乙個標記
this.gettoken();
} else
return result;
}/**
* 計算原子元素運算,包括變數和數字
* @return
* @throws exception
*/
private double parseatomelement() throws exception catch (numberformatexception exc)
//取下乙個標記
this.gettoken();
break;
case variable_token:
//如果當前標記型別是變數,則取變數的值
result = this.findvar(token);
this.gettoken();
break;
default:
this.handleerror(syntax_error);
break;
}return result;
}/**
* 根據變數名獲取變數的值,如果變數名長度大於1,則只取變數的第乙個字元
* @param vname 變數名
* @throws exception
*/ private double findvar(string vname) throws exception
//從例項變數陣列vars中取出該變數的值
return vars[character.touppercase(vname.charat(0)) - 'a'];
}/**
* 回滾,將解析器當前指標往前移到當前標記位置
*/private void putback()
//解析器當前指標往前移動
for (int i = 0; i < this.token.length(); i++)
}/**
* 處理異常情況
* @param errortype 錯誤型別
* @throws exception
*/private void handleerror(int errortype) throws exception
/*** 獲取下乙個標記
*/
private void gettoken()
// 跳過表示式中的空白符
while (this.expindex < this.exp.length()
&& character.iswhitespace(this.exp.charat(this.expindex)))
// 再次檢查表示式是否結束
if (this.expindex == this.exp.length())
//取得解析器當前指標指向的字元
char currentchar = this.exp.charat(this.expindex);
//如果當前字元是乙個分隔符,則認為這是乙個分隔符標記,給當前標記和標記型別賦值,並將指標後移
if (isdelim(currentchar)) else if (character.isletter(currentchar)) else
}//設定標記型別為變數
this.tokentype = variable_token;
} else if (character.isdigit(currentchar)) else
}//設定標記型別為數字
this.tokentype = number_token;
} else
}/**
* 判斷乙個字元是否為分隔符。
* 表示式中的字元包括:
* 加"+"、減"-"、乘"*"、除"/"、取模"%"、指數"^"、賦值"="、左括號"("、右括號")"
* @param c
* @return
*/ private boolean isdelim(char c)
public static void main(string args) throws exception
}
439 三元表示式解析器
題目描述 給定乙個以字串表示的任意巢狀的三元表示式,計算表示式的值。你可以假定給定的表示式始終都是有效的並且只包含數字 0 9,t 和 f t 和 f 分別表示真和假 注意 給定的字串長度 10000。所包含的數字都只有一位數。條件表示式從右至左結合 和大多數程式語言類似 條件是 t 和 f其一,即...
C 乙個簡單的定時表示式 HH mm ss 解析
sysnormallong 00 00 sysnormallong private string sysnormallong 00 00 正常播報時分秒 private string normals private func normalfuncs new func 3 單項驗證 public fu...
lambda表示式的乙個簡單示例
在一些情況下,有些函式在程式中只會被一處地方引用或使用,況且這些函式的內容或邏輯並不複雜,那麼這樣的函式被過多的定義時,會顯得冗餘。那麼一種優化方法是使用lambda表示式,在linq2sql中大量使用了這種表示式。lamda表示式是一種匿名函式,所有 lambda 表示式都使用 lambda 運算...