基于JAVA的TPL解释器

article/2025/10/10 23:38:44

基于JAVA的TPL解释器

编写一个Java程序,该程序读取一个文件中的TPL指令(见下文),并执行这些指令。该语言编写的程序每一行都必须以这些单词中的一个开头,不区分大小写。具体代码可参考链接 https://download.csdn.net/download/qq_43372640/12016782
(ps:原意只是为了让大家参考,所以文件只包括代码说明和源代码(图片形式),没有java文件,如果想要做出效果,需要自己写进软件里生成java文件,请谨慎考虑是否下载)

关于TPL

TPL(Tiny Programming Language)是为本次练习所设计的一种非常简易的编程语言。该语言是完全线性的,它没有分支或循环,每个语句都是按顺序执行。TPL能够处理文本和简单的算法,它具有整型和字符串型两个变量类型。它有8个保留字,具体如下表所示。

保留字名称描述
#注释符
INTEGER声明整型变量
STRING声明字符串型变量
LET分配一个变量
CALCULATE执行算术运算
PRINT写入数据到控制台
PRINTLN在PRINT执行基础上附带一个空行
END终止程序

关键字解释

1、# 是注释符,所以任何以#字符开头的行都被完全忽略。

例:

#ignore this line!
2、INTEGER 可以声明一个整型变量,默认值为0。

例:

 INTEGER myInt

这等同于JAVA中的表达“int myInt=0;”

3、STRING 可以声明一个字符串型变量,默认值为空串。

例:

STRING myString

这等同于JAVA中的表达“String myString;”

4、LET 将值分配给变量(整数或双引号括起来的字符串)。

例:

LET myInt=42
LET myString="Hello World!"
5、CALCULATE 对数值或变量执行数值计算,并将结果赋值给变量(必须提前声明)。支持四个运算符:+, -, *和/(分别为加法、减法,乘法和整数除法)。

例:

CALCULATE myInt=2*2
CALCULATE myInt=myInt+24
CALCULATE myInt=intA/intB
6、PRINT 和 PRINTLN 可以将内容打印到控制台上,唯一的区别是PRINTLN打印完后追加一个新的行(类似Java中的Systme.out.println)。它们可以打印作为参数的文本或变量(字符串或整数)。

例:

PRINTLN "Hello World!"
PRINT myString
PRINTLN myInt
7、END将终止程序。

TPL完整程序样例

下面是一个示例TPL输入文件,用于计算5的阶乘。这个文件放在.txt文件中,方便程序调用
#A TPL Program   to calculate the factorial of 5
INTEGER myInt
INTEGER   factorial
STRING myString
LET   mystring="Factorial Program"
LET myInt=5
CALCULATE   factorial=myInt*4
CALCULATE   factorial=factorial*3
CALCULATE   factorial=factorial*2
PRINTLN   mystring
PRINTLN
PRINT "The   factorial of "
PRINT myInt
PRINT " is   "
PRINTLN   factorial
END

程序打印出来的结果如下:

Factorial CalculationThe factorial of 10 is 3628800

程序实现思路

由于本人能力有限,使用的方法比较傻,就是一行一行去检验,通过对应的关键字来实现相应功能。

  • 首先,先取到文件每行的内容,这里我是通过while语句一行一行读取,并通过hanghao++来进行行号的记录。
BufferedReader br;  	//BufferedReader()函数,作用:将字符流放入缓存里
br = new BufferedReader(new FileReader("G:\\2019-2020\\java\\TheFactorialOf5.txt"));
//读取文件路径的文件while((str = br.readLine()) != null){//读取文件一行的内容hanghao++;......
}
  • 将该行内容全部小写化,这里的操作是为了不区分大小写,如果有需要可以省略也可以大写化。
str1 = str.toLowerCase();// 把str小写化
  • 把该行字符串空格全部删去,因为无法确定有多少空格,以及空格位置,这将会导致后续的判断产生很大困难。
str2 = str1.replaceAll(" ", ""); // 去除空格
//通过replaceAll(String a,String b)函数来首先,即把字符串里面的 a 替换成 b 
//这里把 " "(空格)给替换成 ""(即删掉)了
  • 判别每行的最前面的关键字是哪个,这里我用了最简单你的if语句来首先。其中charAt(int a)函数表示提取该字符串第a+1个字符,如String str=“hello”,则str.charAt(1)=‘e’。而substring(int a, int b)函数则是提取字符串,a是要提取字符串的开始的索引号,如str的0就对应’h’,而b对应结束的位置+1,如str的5对应’o’。equal()则是比较是否一样。
ch1 = str2.charAt(0);// 获取每行第一个字符
if (ch1 == '#')/*--遇见#,注释符,任何以#字符开头的行都被完全忽略。--*/
if (str2.substring(0,3).equals("end"))/*--遇见end,终止程序,并打印一条提示来表明--*/
if (str2.substring(0,7).equals("integer")) /*-- 遇见integer,声明一个整型变量,默认值为0--*/
if (str2.substring(0,6).equals("string"))/*-- 遇见string,声明一个字符串型变量,默认值为空串--*/
if (str2.substring(0,3).equals("let"))/*--遇见let,将值分配给变量(整数或双引号括起来的字符串)--*/
if (str2.substring(0,9).equals("calculate"))/*--遇见calculate,对数值或变量执行数值计算--*/
if (str2.substring(0,5).equals("print"))/*--遇见print将内容打印到控制台上--*/
if (str2.substring(0,7).equals("println"))/*--遇见println将内容打印到控制台上--*/
  • 然后就可以进行相应操作:
    1、遇见 # ,由于是在while循环里判断的,因此直接continue即可。
    2、遇见 end ,直接break即可。
    3、遇见 integer 和 string ,使用哈希表来存储。判断最后一个字节是什么,如果是数字,则存储时直接存等号后 " ,然后是字符串,则存双引号之间的字符串。下面会给大家一个例子,大家可以参考。
    4、遇见 calculate ,通过判断local_yuansuanfu= str2.indexOf(’+’)(也可以是-、*、/)是大于0来判断这里的运算符是哪个,然后通过强制类型转换等方式来进行计算。注意,要先判断是否在哈希表里已经存在。下面会给大家一个例子,大家可以参考。
    5、遇见 print 和 println ,判断相关可能性,进行System.out.print()或System.out.println()就可以了,因为代码比较简单,这里就不给例子了。
//遇见 integer 和 string 的伪代码如下
local_denghao = str2.indexOf('=');//获取等号的位置
len = str2.length();//获取长度
ch2 = str2.charAt(len - 1);//获取每行最后一个字符
if (ch2 >= '0' && ch2 <= '9') //如果最后一个字符是数字map.put(str2.substring(3, local_denghao), str2.substring(local_denghao + 1, len));
/*把let后的第一个位置到等号的位置间的字符串第一个位置前的位置留下作为变量存到第一个位置,把等号的位置到最后一个字符位置间的字符串留下作为这个变量的内容存到第二个位置。*/
else if (ch2 == '"') { //如果最后一个字符是"map.put(str2.substring(3, local_yinhao - 1), str.substring(local_yinhao1 + 1, len_yuanlai-1));
/*把let后一个位置到第一个引号前的位置间的字符串作为变量存到第一个位置,把第一个引号后开始到最后一个引号间的字符串作为这个变量的内容存到第二个位置。*/
//遇见 calculate 的伪代码如下
/*--判断两个元素是否已经存在于map中--*/
while (keys.hasNext()) {//hasNext()检查序列中是否还有元素String key = (String) keys.next();//next()获得序列中的下一个元素,需要强制转换成自己需要的类型if (str2.substring(local_denghao + 1, local_yunsuanfu).equals(key)) //查看运算符前是否是已有变量number1 = true;if (str2.substring(local_yunsuanfu + 1, len).equals(key)) //查看运算符后是否是已有变量number2 = true;
}
/*--运算符前后都是已有变量,如CALCULATE myInt=intA/intB--*/
if(number1==true&&number2==true) {int num1 = Integer.parseInt( map.get(str2.substring(local_denghao + 1, local_yunsuanfu)) );//取运算符前的变量的值并变成int整数型int num2 = Integer.parseInt( map.get(str2.substring(local_yunsuanfu + 1, len)) );//取运算符后的变量的值并变成int整数型map.put( str2.substring(9, local_denghao),String.valueOf(yunsuan(num1,num2)) );//将相应计算后的值转为String字符串型,并放入map中,即赋值给等号前的变量
}
//以此类推其他几种情况,这里运算就是通过判断好运算符然后把两个数字进行相关运算,代码比较简单,可以自行编写

最终效果图

在这里插入图片描述
如果有需要,大家也可以去最开始提到的网址处下载相关资源包,里面有完整代码和使用说明,不过代码不是文本,是图片!上述功能虽然可以实现,但代码有一些逻辑上的错误,功能也有所缺失,请谨慎观看。


http://chatgpt.dhexx.cn/article/CiTvdLWd.shtml

相关文章

U-Boot 之零 源码文件、启动阶段(TPL、SPL)、FALCON、设备树

最近&#xff0c;工作重心要从裸机开发转移到嵌入式 Linux 系统开发&#xff0c;在之前的博文 Linux 之八 完整嵌入式 Linux 环境、&#xff08;交叉&#xff09;编译工具链、CPU 体系架构、嵌入式系统构建工具 中详细介绍了嵌入式 Linux 环境&#xff0c;接下来就是重点学习一…

java .tpl是什么模版_tpl标签定义

canonical 阅读(996) 评论(0) 编辑 收藏 所属分类: Witrix开发平台 tpl自定义标签的设计目标之一是尽量减少配置说明项. 在tpl标签库中, 标签定义格式如下 importVars"varA, varB" otherArgs"optionalArgA, optionalArgB" localScope"trueOrFalse&q…

创建TPL自定义模板

文件布局 <!--1d7c7a527b6335cc7a623305ca940e1findex.tpl.html--><!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999…

php tpl模板文件,php自己创建TPL模板引擎之初学习

一&#xff0c;创建初始化模板所需的文件和文件夹。 1&#xff0c;index.php主文件&#xff0c;用于编写业务逻辑。 2&#xff0c;template.inc.php模板初始化文件&#xff0c;用于初始化模板信息。 3&#xff0c;templates目录存放所有的模板文件。 4&#xff0c;templates_c目…

观远数据苏春园:五年AI+BI路,数智化破局中的变与不变|数据猿采访

““2021年终大型金猿主题策划活动”已正式开启&#xff0c;欢迎报名参与&#xff1a;榜单奖项产业图谱行业报告线下论坛&#xff5c;或点击文末“阅读原文”链接后提交活动意向报名表&#xff0c;并进一步与数据猿工作人员沟通后&#xff0c;可获取相关申报资料与模板。 数据智…

大咖 | 王汉生:从数据到价值的转化,回归分析的“道”与“术”

摘自《数据思维》 作者&#xff1a;王汉生 学过统计学的同学们都知道一件事情&#xff0c;回归分析师数据分析的一个非常重要的模型方法。而且这些模型很可能是线性的、非线性的,也可能是参数的、非参数的,甚至是一元的、多元的,低维的、高维的,不尽相同。所以&#xff0c;把数…

李宏毅深度学习--《Backpropagation》

李宏毅深度学习 Gradient Descent of neural network&#xff1a; n e u r a l n e t w o r k neural\ \ network neural network的参数&#xff1a; θ { w 1 , w 2 , ⋯ , b 1 , b 2 , ⋯ } θ\{w_1,w_2,\cdots,b_1,b_2,\cdots \} θ{w1​,w2​,⋯,b1​,b2​,⋯}计算参数 θ…

郑宇:多源数据融合与时空数据挖掘(转载)

来自&#xff1a; https://mp.weixin.qq.com/s?__bizMzAwMTA3MzM4Nw&mid2649440531&idx1&snd9c92b1f157ee37c7c6e185919a3ffbb&chksm82c0a897b5b721810f4d795cc144d309086274a9071515e727f9f420d7ffb7f06c9b376557ee&scene21#wechat_redirect 和https:/…

近10年数据智能团队建设,联想总结了由内而外的发展经验 | 专访联想集团副总裁田日辉...

来源&#xff1a;大数据文摘 本文约3300字&#xff0c;建议阅读5分钟。 本文为清华大学大数据研究中心联合大数据文摘发起的年度白皮书《顶级数据团队建设全景报告》系列专访的第四篇内容。《报告》囊括专家访谈、问卷、网络数据分析&#xff0c;力求为行业内数据团队的组建和高…

谷俊丽:基于大数据的深度学习

嘉宾介绍&#xff1a;谷俊丽&#xff0c;博士学历&#xff0c;毕业于清华大学-美国University of Illinois Urbana-champaign大学&#xff0c;在清华期间作为核心人员研发过超长指令字数字信号处理器&#xff0c;在美期间曾参与UIUC超级计算机上的研究工作&#xff0c;并工作实…

MyBatis从入门到精通(1):MyBatis入门

作为一个自学Java的自动化专业211大学本科生&#xff0c;在学习和实践过程中”趟了不少雷“&#xff0c;所以有志于建立一个适合同样有热情学习Java技术的参考“排雷手册”。 最近在读刘增辉老师所著的《MyBatis从入门到精通》一书&#xff0c;很有收获&#xff0c;于是将自己学…

给力!低代码开发平台广州流辰信息科技助您增辉创价值!

低代码平台开发公司流辰信息深耕行业多年&#xff0c;一直以市场为导向&#xff0c;凭借敏锐的市场洞察力砥砺前行、拼搏进取&#xff0c;提升研发创新能力&#xff0c;广州流辰信息科技与各新老客户朋友风雨同舟&#xff0c;携手共创宏伟新蓝图&#xff01; 一、熔铸前沿科技 …

汇聚数据库创新力量,加速企业数字化转型

2022年12月29日&#xff0c;以“汇聚数据库创新力量&#xff0c;加速企业数字化转型”为主题的openGauss Summit 2022在线上举行。会上&#xff0c;openGauss社区理事会理事长江大勇对外公布了最近社区及生态进展&#xff0c;并宣布推出资源池化架构&#xff0c;实现软硬融合&a…

【金猿人物展】龙盈智达首席数据科学家王彦博:量子科技为AI大数据创新发展注入新动能...

‍ 王彦博 本文由龙盈智达首席数据科学家王彦博撰写并投递参与“数据猿年度金猿策划活动——2022大数据产业趋势人物榜单及奖项”评选。 ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 回顾2022年大数据行业发展&#xff0c;令人感触最深的是数字经济时代对“数据安全”和…

MyBatis从入门到精通(一):MyBatis入门

最近在读刘增辉老师所著的《MyBatis从入门到精通》一书&#xff0c;很有收获&#xff0c;于是将自己学习的过程以博客形式输出&#xff0c;如有错误&#xff0c;欢迎指正&#xff0c;如帮助到你&#xff0c;不胜荣幸&#xff01; 1. MyBatis简介 ​ 2001年&#xff0c;Clinton …

沈定刚,雷柏英,李超 | Cell Press Live:人工智能在医学影像中的应用

交叉学科 Interdisciplinary 医学影像是临床医疗诊断的重要依据之一。近些年来&#xff0c;随着信息技术的飞速发展&#xff0c;人工智能即AI也更加广泛地应用于医学影像的处理分析中&#xff0c;包括对图像的分割分类及预测等。AI提高了诊断的精准程度和效率&#xff0c;同时也…

汇纳科技张宏俊:加强布局AI大数据,为实体商业服务

数字经济是继农业经济、工业经济之后的主要经济形态,更是稳定经济,推动经济转型的最强劲动力之一。在今年两会政府工作报告中,数字经济的关注程度远比以往更高,首次以“单独成段”的方式进行表述,并重点明确了“深入实施创新驱动发展战略,巩固壮大实体经济根基”。 从中不…

【Java架构:基础技术】一篇文章搞掂:MyBatis

本文篇幅较长&#xff0c;建议合理利用右上角目录进行查看&#xff08;如果没有目录请刷新&#xff09;。 本文主要总结于刘增辉的《MyBatisc从入门到精通》一书&#xff0c;有兴趣的朋友可以自行研读 建议仔细研读官方文档&#xff1a; http://www.mybatis.org/mybatis-3/zh/ …

Oracle的minus使用

Oracle的minus使用 minus 连接两个结果集&#xff0c;最终生成一个结果集。 功能是&#xff1a;第二个结果集&#xff0c;不会出现在最终结果集中&#xff1b; 如果第一个结果集的内容&#xff0c;在第二个结果集之内有包含&#xff0c;则包含的部分在最终结果集被舍弃。 其实…

MySQL MINUS-差集 [猿教程]

https://yuanjiaoc.com/tutorial/article/10143 在本教程中&#xff0c;您将了解 SQL MINUS 运算符以及如何在 MySQL 中使用 join 模拟 MINUS。 请注意&#xff0c;MySQL 不支持 MINUS 运算符。本教程向您展示如何使用连接子句在 MySQL 中模拟 MINUS 运算符。 SQL MINUS 运算符…