一个简单的java递归下降语法分析器例子

news/2024/9/25 0:28:30/
import parser.Parser;
import parser.RecursiveDescentParser;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList = new ArrayList<>(Arrays.asList("int","String"));// 关键词数List<Integer> keyNum = new ArrayList<>(Arrays.asList(1,2));// 运算符和界符List<String> symbolList = new ArrayList<>(Arrays.asList("+","-"));// 运算符和界符的数List<Integer> symbolNum = new ArrayList<>(Arrays.asList(10,11));// 从文件取出的字符String letter;// 将字符转为单词String words;String test ="int main() { int i,j; String a,b;} 123 ccd";//        Parser parser = new Parser();
//        parser.analysis(test,keyList);// 测试语法分析,递归下降分析String input = "5+10*2";RecursiveDescentParser recursiveDescentParser = new RecursiveDescentParser(input);int rs = recursiveDescentParser.parseExpression();System.out.println("Result: " + rs);}
}

package parser;/*** 递归下降解析* 文法规则:* expression = term + expression|term* term = = factor * term|factor* factor = (expression)|number* number = [0-9]+**/
public class RecursiveDescentParser {private String input;private int position;public RecursiveDescentParser(String input){this.input = input;this.position = 0;}public int parseExpression(){int term = parseTerm();if (position < input.length() && Character.toString(input.charAt(position)).equals("+")) {position++;int expression =parseExpression();return term+expression;}return term;}public int parseTerm(){int factor = parsefactor();if (position < input.length() && Character.toString(input.charAt(position)).equals("*")) {position++;int term =parseTerm();return factor*term;}return factor;}public int parsefactor(){if (position < input.length() && Character.toString(input.charAt(position)).equals("(")){position++;int expression =parseExpression();if (position < input.length() && Character.toString(input.charAt(position)).equals(")")){position++;return expression;}}else{StringBuilder number = new StringBuilder();while (position < input.length() && Character.isDigit(input.charAt(position))){number.append(input.charAt(position));position++;System.out.println("number: " + number);}return Integer.parseInt(number.toString());}throw new RuntimeException("错误输入");}
}

测试结果

如果看不懂,可以先学习一下上下文无关文法、产生式、终结符、非终结符的概念。

上下文无关文法、产生式、终结符、非终结符-CSDN博客


http://www.ppmy.cn/news/1438222.html

相关文章

electron中preload.js文件的用法

在Electron中&#xff0c;preload.js文件扮演着非常重要的角色&#xff0c;它允许你在渲染进程中的全局作用域里安全地、有选择地集成Node.js和Electron的API。这是一种在保持渲染进程与主进程隔离的同时&#xff0c;又能使渲染进程具有访问特定Electron API的能力的方法。这种…

leetcode2739--总行驶距离

1. 题意 典型的空瓶换酒问题。 2. 题解 2.1 直接模拟 class Solution { public:int distanceTraveled(int mainTank, int additionalTank) {int ans 0;while (mainTank > 5) {ans mainTank/5*5;int extra min(mainTank/5, additionalTank);mainTank % 5;mainTank e…

前端框架技术革新历程:从原生DOM操作、数据双向绑定到虚拟DOM等框架原理深度解析,Web开发与用户体验的共赢

前端的发展与前端框架的发展相辅相成&#xff0c;形成了相互驱动、共同演进的关系。前端技术的进步不仅催生了前端框架的产生&#xff0c;也为其发展提供了源源不断的动力。 前端的发展 前端&#xff0c;即Web前端&#xff0c;是指在创建Web应用程序或网站过程中负责用户界面…

无人机类型有哪些?

无人机可以按照多种方式进行分类&#xff0c;每种分类都有其特定的无人机类型。以下是一些常见的分类方式及其对应的无人机类型&#xff1a; 1. 按飞行平台构型分类&#xff1a; * 固定翼无人机 * 旋翼无人机 * 无人飞艇 * 伞翼无人机 * 扑翼无人机 2. 按用途分类&#xff1a…

HarmonyOS ArkUI实战开发-NAPI方法扩展

在前 3 小结笔者简单介绍了 NAPI 工程并对生成的源码进行了简单介绍&#xff0c;本节笔者在前 3 小节的基础上对 NAPI 工程做个扩展&#xff0c;再额外添加一个计算 MD5 的方法 md5()。 声明md5方法 在 index.d.ts 文件中声明一个 md5() 方法&#xff0c;该方法接收一个 stri…

计算机网络-IS-IS工作原理之邻接关系建立

前面我们学习了IS-IS的基础理论与相关概念&#xff0c;IS-IS与OSPF一样是链路状态路由协议&#xff0c;需要建立邻接关系&#xff0c;互相传递LSP信息的&#xff0c;因此现在开始学习IS-IS的工作原理&#xff0c;如何建立邻接关系、链路状态数据库同步以及路由更新计算。 一、邻…

每天一个数据分析题(二百八十四)

已知随机变量X服从二项分布 X~B(n,p), 且 E(X)2 ,D(X)1,则P(X3)() A.1/4 B.1/3 C.3/8 D.1/2 题目来源于CDA模拟题库 点击此处获取答案

java的ArrayList LinkedList的操作

文章目录 ArrayList1. ArrayList集合的特点2. 操作 LinkedList1. LinkedList集合的特点2. 操作 参考链接 ArrayList 1. ArrayList集合的特点 2. 操作 add(Object element) 向列表的尾部添加指定的元素。size() 返回列表中的元素个数。get(int index) 返回列表中指定位置的元素…