遞迴下降方式的運算解析器

2021-04-07 08:31:44 字數 2219 閱讀 2559

做了遞迴下降方式的運算解析器(c#),支援變數定義與運算 :

using system;

namespace parserspace

;//語法錯誤型別

int syntax=0;

int unbalparens=1;

int noexp=2;

int divbyzero=3;

//表示式完

string eoe="/0";

public string exp;  //表示式

int expidx;  //表示式當前指標

public string token;//當前的令牌

tokenenum toktype; //當前的令牌型別

//取得下乙個令牌

public  void gettoken()

//如果是空格則跳過

while(expidx//是不是空格完了命令列也完成了

if(expidx==exp.length)

if(exp[expidx]==':')   //如果冒號

else

if (isdelim(exp[expidx]))  //如果是操作符

else if((('a'<=exp[expidx])&&('z'>=exp[expidx]))||

(('a'<=exp[expidx])&&('z'>=exp[expidx])))

//如果是變數

toktype=tokenenum.variable;

}else if (('0'<=exp[expidx])&&('9'>=exp[expidx]))  //如果是數字

toktype=tokenenum.number;

}else  //不可識別的終結表示式

}//如果是乙個分隔符則返回真值

private bool isdelim(char c)

//解析器入口程式

public double evaluate(string expstr)

//處理賦值

private double evalexp1()

else

}return evalexp2();

}//兩個項的加減

private double evalexp2()

}return result;

}//兩個項的乘或除

private double evalexp3()

}return result;

}//指數運算

private double evalexp4()

else

for(int t=(int)partialresult-1;t>0;t--)

result=result*ex;

}return result;

}//計算一元的加減運算

private double evalexp5()

result=evalexp6();

if(op.equals('-'))

result=-result;

return result;

}//處理加括號的表示式

private double evalexp6()

else

result=atom();

return result;

}//讀取數字

private double atom()

catch(formatexception exc)

gettoken();

break;

case tokenenum.variable:

result=findvar(token);

gettoken();

break;

default:

handleerr(syntax);

break;

}return result;

}//處理錯誤

private void handleerr(int error)

;throw new parserexception(err[error]);

}//返回變數的值

private double findvar(string vname)

return vars[char.toupper(vname[0])-'a'];

}//返回令牌到輸入字串流中

private void putback()

public parser()}}

Druid SQL 解析器的解析過程

這篇文嘗試近距離地 druid sql 解析器如何工作。以這份 為例 author beanlam date 2017年1月10日 下午11 06 26 version 1.0 public class parsermain 一開始,需要初始化乙個 parser,在這裡sqlstatementpar...

JAL的XML解析器

基於sax的,試了一下,相當好用 procedure tform1.domview document idocument view ttreeview procedure par mlnode datanode ielement treenode ttreenode vari iiterator n...

BeautifulSoup解析器的選擇

在我們使用beautifulsoup的時候,選擇怎樣的解析器是至關重要的。使用不同的解析器有可能會出現不同的結果!今天遇到乙個坑,在解析某html的時候。使用html.parser解析器自己將table標籤截斷了 當然這與html本身有直接關係 原html如下 排序 中標候選人名稱 投標 質量 工期...