java递归下降分析_JAVA中的递归下降

java递归下降分析_JAVA中的递归下降publicclassParser{//ThesearethetokentypefinalintNONE=0;finalintDELIMITER=1;finalintVARIABLE=2;finalintNUMBER=3;//ThesearethetypeofsyntaxerrorsfinalintSYNTAX=0;final…

大家好,又见面了,我是你们的朋友全栈君。

public class Parser {

// These are the token type

final int NONE = 0;

final int DELIMITER = 1;

final int VARIABLE = 2;

final int NUMBER = 3;

// These are the type of syntax errors

final int SYNTAX = 0;

final int UNBALPARENS = 1;

final int NOEXP = 2;

final int DIVBYZERO = 3;

// These token indicates end-of-expression

final String EOF = “\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();

// no expression present

if (token.equals(EOF))

handleErr(NOEXP);

result = evalExp2();

if (!token.equals(EOF)) {

handleErr(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)

handleErr(DIVBYZERO);

result = result / partialResult;

break;

case ‘%’:

if (partialResult == 0.0)

handleErr(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;

if(token.equals(“(“)){

getToken();

result = evalExp2();

if(!token.equals(“)”))

handleErr(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) {

handleErr(SYNTAX);

}

getToken();

break;

default:

handleErr(SYNTAX);

break;

}

return result;

}

private void handleErr(int error) throws ParserException {

String[] err = { “Syntax error”, “Unbalanced parentheses”,

“No expression Present”, “Division by zero” };

throw new ParserException(err[error]);

}

//下面的函数就是获得独立元素的值,并且用tokType来保存类型

private void getToken() {

// obtain the next token

tokType = NONE;

token = “”;

if (expIdx == exp.length()) {

token = EOF;

return;

}

while (expIdx < exp.length()

&& Character.isWhitespace(exp.charAt(expIdx)))

++expIdx;

if (expIdx == exp.length()) {

token = EOF;

return;

}

if (isDelim(exp.charAt(expIdx))) {// is operator

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 = EOF;

return;

}

}

private boolean isDelim(char c) {

if ((“+-*/%^=()”.indexOf(c)) != -1)

return true;

return false;

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149323.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mapGetters 辅助函数「建议收藏」

    mapGetters 辅助函数「建议收藏」1:mapGetters:辅助函数mapGetters:辅助函数mapGetters:辅助函数仅仅将store中的getter映射到局部计算属性:1:import{mapGetters}from’vuex’2:exportdefault{computer:{//使用对象展开运算符将getter混入computer对象中…mapGetters([‘getMachin…

    2022年5月2日
  • Excel 宏编程的常用代码

    Excel 宏编程的常用代码Excel宏编程的常用代码我们常用Excel统计一些数据,如果善用VBA,就能自动做出各种复杂的报表,懒人就是追求一劳永逸!不过,也不是真懒啦,只是用智慧(脑力劳动)将自身从体力劳动中解放出来而已,人类也是这样进步的。我有这样的感觉,就是每见到一个语句或函数,都会激发出偷懒的灵感来,哈哈,很自恋了,其实好玩而已。————————-

    2022年6月11日
  • 怎么制止qq刷屏代码-vbs「建议收藏」

    怎么制止qq刷屏代码-vbs「建议收藏」最近有些人向小编反应QQ刷屏代码没办法关,小编认为有必要发布一下关程序的代码,专门针对上次的QQ刷屏代码:sety=getobject(“winmgmts:\\.\root\cimv2”)setx=y.execquery(“select*fromwin32_processwherename=’wscript.exe'”)foreachiinxi.terminat…

    2022年6月14日
  • vdbench使用

    vdbench使用简介vdbench是一个I/O工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具,容易使用,而且常常用于测试和基准测试。可以使用vdbench测试磁盘和文件系统的读写性能。名词解释vdbench中常用的一些名词解释:HD主机定义SD存储定义WD工作负载定义RD运行定义FSD文件系统存储定义FWD文件工作负载定义安装和配置linux下配置vdbench(1)下载Vdbench…

    2022年5月12日
  • 故障恢复控制台_win7故障恢复控制台怎么进入

    故障恢复控制台_win7故障恢复控制台怎么进入一、恢复控制台是何许人也?开机F8进入安全模式,杀毒….相信不管是菜鸟还是老鸟都小Kiss了,然而有一天我们发现不能进入安全模式了,选择DOS启动,但是大多数的不支持NTFS,还是PE盘我想你

    2022年8月5日
  • 关于group by的用法 原理

    关于group by的用法 原理写在前面的话:用了好久groupby,今天早上一觉醒来,突然感觉groupby好陌生,总有个筋别不过来,为什么不能够select*fromTablegroupbyid,为什么一定不能是*,而是某一个列或者某个列的聚合函数,groupby多个字段可以怎么去很好的理解呢?不过最后还是转过来了,简单写写吧,大牛们直接略过吧。=========正文开始===========  …

    2022年5月9日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号