java 词法分析练习

import parser.Parser;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);}
}

package parser;import java.util.List;public class Parser {public void analysis(String test,List<String> keyList){System.out.println("test:" + test);int length = test.length();System.out.println("length:" + length);// 字符类型for(int num=0;num<length;){char ch = test.charAt(num);System.out.println("ch:" + ch);int typeword = typeword(ch);
//            System.out.println("typeword:" + typeword);String addword=Character.toString(ch);String[] rs;switch (typeword){case 1:rs= number(test,addword,num,keyList);addword = rs[0];num = Integer.parseInt(rs[1]);System.out.println("<"+addword+",1,int"+">");break;case 2:rs= identifier(test,addword,num,keyList);addword = rs[0];num = Integer.parseInt(rs[1]);System.out.println("<"+addword+",2,String"+">");break;case 3:rs= symbol(test,addword,num);addword = rs[0];num = Integer.parseInt(rs[1]);System.out.println("<"+addword+",3,symbol"+">");break;default:num++;break;}}}public int typeword(char str) {if (Character.isDigit(str)) {return 1;}if (Character.isLetter(str)) {return 2;}if (Character.toString(str).equals("+") || Character.toString(str).equals("-")) {return 3;}return 0;}public String[] identifier(String letter, String s, int n, List<String> keyList) {int j = n + 1;boolean flag = true;while (flag) {if (j >= letter.length()) {break;}if (isNumeric(letter.charAt(j)) || Character.isLetter(letter.charAt(j))) {s += letter.charAt(j);if (isKeyword(keyList, s)) {n = ++j;return new String[]{s, String.valueOf(n)};}j++;} else {flag = false;}}n = j;return new String[]{s, String.valueOf(n)};}public String[] symbol(String letter, String s, int n) {int j = n + 1;boolean flag = true;while (flag) {if (Character.toString(letter.charAt(j)).equals("+") || Character.toString(letter.charAt(j)).equals("-")) {s += letter.charAt(j);j++;} else {flag = false;}}n = j;return new String[]{s, String.valueOf(n)};}public String[] number(String letter, String s, int n, List<String> keyList) {int j = n + 1;boolean flag = true;while (flag) {if (isNumeric(letter.charAt(j))) {s += letter.charAt(j);j++;} else {flag = false;}}n = j;return new String[]{s, String.valueOf(n)};}public static boolean isKeyword(List<String> keyList, String str) {try {return keyList.contains(str);} catch (Exception e) {return false;}}public static boolean isNumeric(char str) {try {Double.parseDouble(Character.toString(str));return true;} catch (Exception e) {return false;}}
}

测试结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/313781.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用STM32 HAL库实现USART串口通信,并通过printf重定向输出“Hello World“

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 上一篇使用STM32F407的HAL库只需1行代码实现US…

AI大模型探索之路-训练篇1:大语言模型微调基础认知

文章目录 前言一、微调技术概述二、微调的必要性三、大模型的微调方法四、微调过程中的技术细节五、微调后的模型评估与应用总结 前言 在人工智能的广阔研究领域内&#xff0c;大型预训练语言模型&#xff08;Large Language Models, LLMs&#xff09;已经成为推动技术革新的关…

龙芯中标麒麟系统打包生成rpm包步骤

1、检查系统是否安装 rpmbuild 和 rpmdevtools 直至rpmdev-setuptree命令执行成功&#xff0c;执行成功后&#xff0c;此时会在用户根目录下创建文件rpmbuild打包文件夹。 rpmbuild为打包工作目录&#xff0c;结构如下&#xff1a; 解释目录结构&#xff1a; BUILD&#xff1…

Windows安装ElasticSearch

Windows安装ElasticSearch 安装完之后 ElasticSearch服务的段括号是9200&#xff0c;可以直接通过localhost:9200在浏览器里面访问 如下图&#xff1a; 而Kibana&#xff0c;也就是ElasticSearch的客户端的端口号是5601&#xff0c;我们可以直接通过localhost:5601访问 如下…

javaEE初阶——多线程(八)——常见的锁策略 以及 CAS机制

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享分治算法关于多线程进阶的章节——关于常见的锁策略以及CAS机制 如果有不足的或者错误的请您指出! 目录 多线程进阶1.常见的锁策略1.1乐观锁和悲观锁1.2重量级锁 和 轻量级锁1.…

Pytorch 学习路程 - 1:入门

目录 下载Pytorch 入门尝试 几种常见的Tensor Scalar Vector Matrix AutoGrad机制 线性回归尝试 使用hub模块 Pytorch是重要的人工智能深度学习框架。既然已经点进来&#xff0c;我们就详细的介绍一下啥是Pytorch PyTorch 希望将其代替 Numpy 来利用 GPUs 的威力&…

云赛道---AI开发框架

MindSpore 旨在提供端边云全场景的 AI 框架。 MindSpore 可部署于端、边、云不同的 硬件环境&#xff0c;满足不同环境的差异化需求&#xff0c;如支持端侧的轻量化部署&#xff0c;支持云侧丰富的 训练功能如自动微分、混合精度、模型易用编程等。 MindSpore 全场景的几个重…

IIR滤波器的设计与实现(内含设计IIR滤波器的高效方法)

写在前面&#xff1a;初学者学习这部分内容&#xff0c;要直接上手写代码可能会感到比较困难&#xff0c;我这里推荐一种高效快速的设计IIR,FIR滤波器的方法——MATLAB工具箱&#xff1a;filterDesigner。打开的方法很简单&#xff0c;就是在命令行键入&#xff1a;filterDesig…

Visual Studio安装MFC开发组件

MFC由于比较古老了&#xff0c;Visual Studio默认没有这个开发组件。最近由于一些原因&#xff0c;需要使用这个库&#xff0c;这就需要另外安装。 参考了网上的一些资料&#xff0c;根据实际使用&#xff0c;其实很多步骤不是必须的。 https://zhuanlan.zhihu.com/p/68117276…

TypeScript 装饰器

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:TypeScript 装饰器 目录 一、是什么 二、使用方式 类装饰 方法/属性装饰 参数装饰 访问器…

Objective-C网络数据捕获:使用MWFeedParser库下载Stack Overflow示例

概述 Objective-C开发中&#xff0c;网络数据捕获是一项常见而关键的任务&#xff0c;特别是在处理像RSS源这样的实时网络数据流时。MWFeedParser库作为一个优秀的解析工具&#xff0c;提供了简洁而强大的解决方案。本文将深入介绍如何利用MWFeedParser库&#xff0c;以高效、…

深度学习系列64:数字人wav2lip详解

1. 整体流程 第一步&#xff0c;加载视频/图片和音频/tts。用melspectrogram将wav文件拆分成mel_chunks。 第二步&#xff0c;调用face_detect模型&#xff0c;给出人脸检测结果&#xff08;可以改造成从文件中读取&#xff09;&#xff0c;包装成4个数组batch&#xff1a;img…

ExcelVBA把当前工作表导出为PDF文档

我们先问问Kimi Excel导出为PDF的方法有多种&#xff0c;以下是一些常见的方法&#xff1a; 1 使用Excel软件的内置功能&#xff1a; 打开Excel文件&#xff0c;点击“文件”菜单。 选择“另存为”&#xff0c;在“保存类型”中选择“PDF”。 设置保存路径和文件名&#xff…

transformer 最简单学习3, 训练文本数据输入的形式

1、输入数据中&#xff0c;源数据和目标数据的定义 def get_batch(source,i):用于获取每个批数据合理大小的源数据和目标数据参数source 是通过batchfy 得到的划分batch个 ,的所有数据&#xff0c;并且转置列表示i第几个batchbptt 15 #超参数&#xff0c;一次输入多少个ba…

GPU深度学习环境搭建:Win10+CUDA 11.7+Pytorch1.13.1+Anaconda3+python3.10.9

1. 查看显卡驱动及对应cuda版本关系 1.1 显卡驱动和cuda版本信息查看方法 在命令行中输入【nvidia-smi】可以当前显卡驱动版本和cuda版本。 根据显示,显卡驱动版本为:Driver Version: 516.59,CUDA 的版本为:CUDA Version 11.7。 此处我们可以根据下面的表1 显卡驱动和c…

iText生成PDF文件

导语&#xff1a; 本文基于 iText7 &#xff1a;7.1.16 生成。 官方文档链接&#xff1a;iText 从版本入口可进入到下面页面 一、引言 常见生成PDF文件的有两种方法&#xff0c;一是先生成 word文档&#xff0c;然后将word转换成PDF文件&#xff1b;另一种则是直接生成PDF文件…

改变 centos yum源 repo

centos 使用自带的 repo 源 速度慢&#xff0c;可以改为国内的&#xff0c;需要改两个地方 centos7.repo CentOS-Base.repo 首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup下载对应版本repo文件…

NameNode锁细粒度优化在B站的实践

1. 背景 随着业务的高速发展&#xff0c;针对HDFS元数据的访问请求量呈指数级上升。在之前的工作中&#xff0c;我们已经通过引入HDFS Federation和Router机制实现NameNode的平行扩容&#xff0c;在一定程度上满足了元数据的扩容需求&#xff1b;也通过引入Observer NameNode读…

Quarto Dashboards 教程 2:Dashboard Layout

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

C语言扫雷游戏完整实现(上)

文章目录 前言一、新建好头文件和源文件二、实现游戏菜单选择功能三、定义游戏函数四、初始化棋盘五、 打印棋盘函数六、布置雷函数七、玩家排雷菜单八、标记功能的菜单九、标记功能菜单的实现总结 前言 C语言从新建文件到游戏菜单&#xff0c;游戏函数&#xff0c;初始化棋盘…