乙個簡單的表示式解析器

2021-04-17 22:29:18 字數 4122 閱讀 1293

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 運算...