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;

}

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 你对贝叶斯统计都有怎样的理解?

    你对贝叶斯统计都有怎样的理解?作者:王冲链接:https://www.zhihu.com/question/21134457/answer/40753337来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。谢邀。Bayesian学派说概率是一个人对于一件事的信念强度,概率是主观的。而频率派是说概率是客观的。所有能用客观概率假设能解的题,用主观概率假设也都能解,答案一样。对

  • 模仿学习(Imitation Learning)概述

    模仿学习(Imitation Learning)概述本篇文章是基于台大李宏毅老师的课程写的,如有疏漏,请看原课程。https://www.youtube.com/watch?v=rl_ozvqQUU81.什么是模仿学习?模仿学习(ImitationLearning)也被称为基于演示的学习(LearningByDemonstration)或者学徒学习(ApprenticeshipLearning)。机器是可以与环境进行交互的,但…

  • 字典树的数据结构_数据结构快速排序

    字典树的数据结构_数据结构快速排序本文主要包括以下内容:Trie字典树的基本概念Trie字典树的基本操作插入查找前缀查询删除基于链表的Trie字典树Set性能对比LeetCode相关线段树的问题LeetCode第208号问题LeetCode第211号问题LeetCode第677号问题Trie字典树的基本概念上一篇我们介绍了线段树(SegmentTree),本文主要介绍Trie字典树…

  • python sqlite中通过字段名获取查询结果

    在连sqlite数据库时,用fetchall()查询结果,是用row[0],row[1]这样的方式来打印每列的结果但是我想用row[“字段名”]方式查询怎么办?MySQLdb的实现方法是:&#16

    2021年12月27日
  • 郁闷中…………

    郁闷中…………

  • SpringBoot笔记(6)

    SpringBoot笔记(6)

    2021年11月12日

发表回复

您的电子邮箱地址不会被公开。

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