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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • curl 模拟 GET\POST 请求,以及 curl post 上传文件「建议收藏」

    curl 模拟 GET\POST 请求,以及 curl post 上传文件「建议收藏」curl模拟GET\POST请求,以及curlpost上传文件一般情况下,我们调试数据接口,都会使用一个postman的工具,但是这个工具还是有点大了。事实上,我们在调试一些小功能的时候,完全没有必要使用它。在命令行中,我们使用curl这个工具,完全可以满足我们轻量的调试要求。下面,我们来简单的说一下,curl的一些常见使用方法:curlGET请求cu…

    2022年10月18日
    3
  • js 数组 复制「建议收藏」

    js 数组 复制「建议收藏」在js中,数组赋值是属于引用赋值,如:vara=[1,2,3]varb=a;若b修改,a也会做相应的改变,若要在b改变的时候保持a不变则需要深度复制b=JSON.parse(JSON.stringify(a))这样的话b在改变的话a就不会改变沈阳北站候车室南入口沈阳北站候车室南入口…

    2022年7月13日
    16
  • 单片机之IIC通信协议「建议收藏」

    单片机之IIC通信协议「建议收藏」概念I2C(IIC,Inter-IntegratedCircuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。硬件IIC:硬件IIC速度比模拟快,并且可以用DMA。硬件IIC会自动匹配与从机的通信时序,…

    2022年6月9日
    53
  • 笔记本计算机卡,笔记本电脑越来越卡怎么办 不同原因解决方法不同[通俗易懂]

    笔记本计算机卡,笔记本电脑越来越卡怎么办 不同原因解决方法不同[通俗易懂]1、由于系统原因导致笔记本越用越卡的问题,懂装系统并且不怕麻烦的用户可以重装新系统,这样可以彻底解决系统卡顿问题,适当的清理一些不要的垃圾文件软件等,若是不懂得小白或者怕麻烦的人,也可以选择市面上的各类XX安全卫士、XX电脑管家带有的垃圾清理功能清理一些垃圾文件及注册表等无用文件、软件,并且养成定期清理垃圾的好习惯。2、由于硬件原因导致笔记本越用越卡的问题,则需要看看笔记本是因为哪些硬件导致的,决…

    2025年11月1日
    2
  • matlab画点图如何设置点的大小颜色_matlab如何根据点绘制曲线图

    matlab画点图如何设置点的大小颜色_matlab如何根据点绘制曲线图线型 说明 标记符 说明 颜色 说明 – 实线(默认) + 加号符 r 红色 — 双划线 …

    2026年2月1日
    5
  • 一图了解群环域「建议收藏」

    一图了解群环域「建议收藏」一图了解群环域最近Nickname4th.qicp.vip暂时挂掉了,所以先在这里发一下就群环域的联系做了一个简图,并不全面但是足以应付密码学的要求。网上看了很多教程,但是讲得最清晰最有联系性的文章私以为是这篇:http://sparkandshine.net/algebraic-structure-primer-group-ring-field-vector-space/这位博主…

    2022年6月18日
    33

发表回复

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

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