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.hqwc.cn/news/650555.html

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

相关文章

一次违法网站的渗透经历

0x01 前言 在一次攻防演练中&#xff0c;我发现了一个有趣的渗透路径。在信息收集阶段&#xff0c;我注意到目标网站和用户资产网站共享相同的IP网段。这意味着它们可能在同一台服务器上托管&#xff0c;或者至少由同一家互联网服务提供商管理。这种情况为我们的渗透测试提供了…

Java本地缓存技术选型(Guava Cache、Caffeine、EhCache)

前言 对一个java开发者而言&#xff0c;提到缓存&#xff0c;第一反应就是Redis。利用这类缓存足以解决大多数的性能问题了&#xff0c;我们也要知道&#xff0c;这种属于remote cache&#xff08;分布式缓存&#xff09;&#xff0c;应用的进程和缓存的进程通常分布在不同的服…

046、注意力机制

之——从心理学出发 杂谈 动物需要在复杂环境下有效关注值得注意的点。 人类根据随意线索和不随意线索选择关注的点。 正文 1.线索 不随意&#xff08;随着意识&#xff09;线索&#xff08;不主动&#xff09;&#xff0c;随意&#xff08;随着意识&#xff09;&#xff08;主…

【opencv 加速推理】如何安装 支持cuda的opencv 包 用于截帧加速

要在支持CUDA的系统上安装OpenCV&#xff0c;您可以使用pip来安装支持CUDA的OpenCV版本。OpenCV支持CUDA加速&#xff0c;但需要安装额外的库&#xff0c;如cuDNN和NVIDIA CUDA Toolkit。以下是一般步骤&#xff1a; 安装NVIDIA CUDA Toolkit: 首先&#xff0c;您需要安装NVID…

分享一些实用的工具

1、amCharts5&#xff1a;模拟航线飞行/业务分布图/k线/数据分析/地图等 网址&#xff1a; JavaScript mapping library: amCharts 5https://www.amcharts.com/javascript-maps/ Demo地址&#xff1a;Chart Demos - amChartshttps://www.amcharts.com/demos/#maps 他分为amC…

python中如何用matplotlib写饼图

#代码 import matplotlib.pyplot as plt# 设置绘图的主题风格 plt.style.use(ggplot) # 中文乱码和坐标轴负号的处理 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]False plt.rcParams[figure.figsize][10,8] # 构造数据 x [0.2515,0.3724,0.3336…

第三届锐捷全国大学生信息技术大赛报名启动,丰厚奖金等你挑战

2024年4月10日,ICT行业全国赛事第三届锐捷大赛已启动初赛报名,初赛阶段的报名截止日期为5月24日。锐捷全国大学生信息技术大赛(以下简称锐捷大赛)是锐捷网络面向全国大学生打造的人才竞技交流赛事,旨在促进学生综合素质、专业化水平和创新能力的整体提升,培养符合社会用人标准的…

视频转换难?这款视频转换器,让你高效完成转换

随着数字媒体技术的快速发展&#xff0c;视频格式的多样性常常让人感到困扰。不同的设备、不同的平台&#xff0c;视频文件可能都要转换成对应的格式和大小才能让用户正常观看。为了满足人们对视频格式转换的需求&#xff0c;多种类型的视频转换器应运而生&#xff0c;它们能够…

【AIGC调研系列】Vitron通用像素级视觉多模态LLM是什么

Vitron通用像素级视觉多模态大语言模型是一款重磅的通用视觉多模态大模型&#xff0c;它支持从视觉理解到视觉生成、从低层次到高层次的一系列视觉任务。这款模型能够处理复杂的视觉任务&#xff0c;并理解和生成图像和视频内容[2]。Vitron解决了困扰大语言模型产业已久的图像/…

【智能算法】蜉蝣算法(MA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;K Zervoudakis等人受到自然界蜉蝣交配繁殖行为启发&#xff0c;提出了蜉蝣算法&#xff08;Mayfly Algorithm, MA&#xff09;。 2.算法原理 2.1算法思想 MA灵感来自蜉蝣交配…

OSPF的协议特性

路由汇总的概念 l 路由汇总&#xff08; Route Aggregation &#xff09;&#xff0c;又称路由聚合&#xff08;Route Summarization&#xff09;&#xff0c;指的是把一组明细路由汇聚成一条汇总路由条目的操作 l 路由汇总能够减少路由条目数量、减小路由表规模&#xff0…

Coze玩转ChatGPT-4,存算解决大模型算力

随着神经网络技术的不断发展&#xff0c;特别是在Transformer架构兴起之后&#xff0c;模型规模呈指数级增长。2023年3月&#xff0c;ChatGPT-4正式发布&#xff0c;ChatGPT-4具有联网搜索、图片生成、自建GPTs等多项重磅功能&#xff0c;在各个方面吊打其他大语言模型&#xf…