Java语言编写TPL语言词法分析器
程序实现原理:
将TXT文本中的数据读出,并按照其类别的不同,将关键字、数字以及运算符识别出来。
一、词法分析实验步骤
1. 熟悉TPL语言
2. 编写TPL语言程序,至少3个,一个简单,一个复杂的(包括循环,分支,以及它们的相互嵌套),一个错误的(带非法字符的,如$ 和 整数位数>8的整数)
3.根据指导书中的第三章中的DFA 编写词法分析程序。 程序输入:上面的三个TPL程序,程序输出: 分离出的单词。注:单词需要保存,为语法分析做准备
4.将单词分类,对每类单词都进行简化,均简化成一个字符(整数除外),分类表见指导书表3-1。在此基础上编写程序,将上面分离出的单词进化简化并保存。注:所有的关系运算符均简化为同一个字符r. 所有的自定义标识符均简化为 i
二、词法分析器的功能
1.能够识别数字、字符、运算符、界符和部分特殊符号
2.能有一定的纠错能力(如数字长度超长,括号不匹配等)
代码如下:
package bianyiyuanliTS;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; public class test01 {
public static boolean SZCW=false; //数字错误标记
public static boolean KHCW=false; //括号错误标记
public static boolean HKHCW=false; //花括号错误标记
public static boolean WSBDFH=false; //未识别的符号错误标记
public static int kuohao=0; //记录括号的数量
public static int huakuohao=0; //记录花括号的数量
public static int CWSL=0; //记录错误的数量
public static int hanghao=1; //记录读取的行号
public int ch; //读取到的字符的ascll码值
public static StringBuffer neirong = new StringBuffer(); //存放构成单词符号的字符串
//用数组存放TPL语言的保留字
public String [] guanjianzi = new String[]{"begin","end","if","then","else","while","do","not","and","or","true","false","until"};
//---------------主函数---------------
public static void main(String[] args)
{
test01 file=new test01();
file.loadfile();
if(kuohao%2!=0){ //如果括号不匹配
CWSL++;
KHCW=true;
}
if(huakuohao%2!=0){ //如果花括号不匹配
CWSL++;
HKHCW=true;
}
if(WSBDFH){ //如果包含未识别的符号$
CWSL++;
}
//纠错部分
if(CWSL==0){ //代码中没有错误
System.out.println("-------共有"+hanghao+"行,词法分析结束!当前代码中没有错误!-------");
}
else
{
System.out.println("-------共有"+hanghao+"行,词法分析结束!当前存在"+CWSL+"处错误,代码中【*】表示有错-------");
if(SZCW){
System.out.println("------数值长度错误-------");
}
if(KHCW){
System.out.println("-------括号不匹配-------");
}
if(HKHCW){
System.out.println("-------花括号不匹配-------");
}
if(WSBDFH){
System.out.println("-------代码存在不能识别的符号‘$’-------");
}
}
}
//----------------输出函数---------------
public void Retract(){
if(shibie()== 1){
System.out.println("保留字--"+neirong);
}else if(shibie() == 3){
System.out.println("变量--"+neirong);
}
else if(shibie() == 2){
if(neirong.length()>8){ //检查数字长度是不是超过8位
System.out.println("数字--"+neirong+"超出长度---------------【*】");
CWSL++;
SZCW=true;
}
else{System.out.println("数字--"+neirong);}
}
neirong.delete(0, neirong.length()); //将已经识别的字符串从全部内容中删去
} //---------判断是否是字母a-z/A-Z ---------------
public boolean Iszimu(){
if((ch>=65 && ch <= 90) || (ch >= 97 && ch <=122)){
return true;
}
return false;
} //------------判断是否是数字 0-9 -----------
public boolean Isshuzi(){
if(ch>=48 && ch <= 57){
return true;
}
return false;
}
//---------------------识别文本内容函数---------------
public int shibie(){
for(int i = 0;i < guanjianzi.length;i++){
if(neirong.toString().equals(guanjianzi[i])){ // equals()函数,功能:比较字符串的内容
return 1;
}
}
if(neirong.length() != 0){ //还有内容存在
if(neirong.charAt(0)>='0' && neirong.charAt(0)<='9'){
return 2; //是数字
}
if(Iszimu()==true || Iszimu()==false){ //是变量
return 3;
}
}
return 0;
} //---------------连接字符函数-------------
public void Concat(char ch){
neirong.append(ch); //append()函数,功能连接一个字符串到末尾
} //----------------读取文件函数------------
public void loadfile(){
BufferedReader br; //BufferedReader()函数,作用:将字符流放入缓存里
try {
br = new BufferedReader(new FileReader("D:/test1.txt"));
System.out.println("---------读取文件内容完毕!!----------");
System.out.println("----------词法分析如下:--------------");
System.out.println("-----------第1行开始:");
while((ch = br.read()) != -1){ //正确的读取到字符,rand()函数返回值为-1 时为读取出错
if(ch!=32&&ch!=13&&ch!=10){ //遇到不是空格或者回车符
if(Iszimu()){ //遇到字母
if(Iszimu() == true || Isshuzi() == true){ //遇到字母并且后面是数字
Concat((char) ch); //Concat()函数,作用:将其连接
}
}else if(Isshuzi() == true){ //遇到单独数字时追加
Concat((char) ch);
}
//判断界符,包括:(、)、{、}
else if((char) ch == '(')
{
Retract();
kuohao++;
System.out.println("界符--"+(char) ch);
}
else if((char) ch == ')')
{
Retract();
kuohao++;
System.out.println("界符--"+(char) ch);
}
else if((char) ch == '{')
{
Retract();
huakuohao++;
System.out.println("界符--"+(char) ch);
}
else if((char) ch == '}')
{
Retract();
huakuohao++;
System.out.println("界符--"+(char) ch);
}
//判断运算符,包括:+、-、*、/、:= 、=、<>、>、>=、<、<=。
else if((char) ch == '<')
{
Retract();
System.out.println("逻辑运算符--'"+(char) ch+"'");
} else if((char) ch == '>')
{
Retract();
System.out.println("逻辑运算符--'"+(char) ch+"'");
}
else if((char) ch == '=')
{
Retract();
System.out.println("逻辑运算符--'"+(char) ch+"'");
}
else if((char) ch == ':')
{
Retract();
System.out.println("逻辑运算符--'"+(char) ch+"'");
}
else if((char) ch == '*')
{
Retract();
System.out.println("运算符--'"+(char) ch+"'");
} else if((char) ch == '-')
{
Retract();
System.out.println("运算符--'"+(char) ch+"'");
} else if((char) ch == '+')
{
Retract();
System.out.println("运算符--'"+(char) ch+"'");
} else if((char) ch == '/')
{
Retract();
System.out.println("运算符--'"+(char) ch+"'");
}
//判断是否有不能识别的符号
else if((char) ch == '$')
{
Retract();
WSBDFH=true;
System.out.println("未识别的符号--'"+(char) ch+"'---------------【*】");
}
}else{
Retract();
}
//提示行号
if(ch==13){
hanghao++;
System.out.println("----------第"+hanghao+"行开始:");
}
}
} catch (FileNotFoundException e1) {
System.out.println("----------找不到文件请检查文件目录--------------");
} catch (IOException e) {
System.out.println("----------文件读取异常--------------");
}
}
}
测试文本(D:/test1.txt)的内容:
{if not (x=y then$
if y1=588882222 then
y:=y+1

Java语言编写TPL语言词法分析器的更多相关文章
- [改善Java代码]易变业务使用脚本语言编写
建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...
- 使用java语言编写窗口按钮
使用java语言编写窗口按钮 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import ja ...
- Atiitt 使用java语言编写sql函数或存储过程
Atiitt 使用java语言编写sql函数或存储过程 1.1. java编写sql函数或存储过程的机制1 1.2. Java编写sp的优点1 1.3. 支持java源码,class文件,blog f ...
- Fastjson是一个Java语言编写的高性能功能完善的JSON库。
简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...
- 第二次作业利用java语言编写计算器进行四则运算
随着第一次作业的完成,助教 牛老师又布置了第二次作业:用java语言编写一个程序然后进行四则运算用户用键盘输入一个字符来结束程序显示统计结果.一开始看到这个题目我也着实吓了一跳 因为不知道如何下手而且 ...
- 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)
使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置jdk-15.0.1-免配置路径版提取码:earu免安装版 ...
- 提高java编程质量 - (一)易变业务使用脚本语言编写
脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型:2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3.简单:脚本语言语法比 ...
- Java之戳中痛点 - (1)易变业务使用脚本语言编写
脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型:2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3.简单:脚本语言语法比 ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
随机推荐
- Poj 3189 Steady Cow Assignment (多重匹配)
题目链接: Poj 3189 Steady Cow Assignment 题目描述: 有n头奶牛,m个棚,每个奶牛对每个棚都有一个喜爱程度.当然啦,棚子也是有脾气的,并不是奶牛想住进来就住进来,超出棚 ...
- 2015湘潭市第七届大学生程序设计竞赛 —— Fraction
题目大意: 小数化分数,但是分母限制在[1,1000],很明显的枚举,但是在赛场上的时候傻逼了,无论怎么枚举,怎么二分就是wa,wa到死···········. (ps:我要给出题人寄刀片~~~~), ...
- 1、IO概述及File类
- iOS 实现复选框 checkbox --转
转自:http://www.cnblogs.com/ygm900/p/3468891.html -(void)checkboxClick:(UIButton *)btn{ btn.select ...
- JSP页面自动刷新
1.页面自动刷新:把如下代码加入<head>区域中<meta http-equiv="refresh" content="20">,其中 ...
- js中,浏览器中不同元素位置属性解析
offset() 只对可见元素有效,获取匹配元素在当前视口的相对偏移,返回的对象有两个整型属性,top和left,像素计算: position() 相对父元素的偏移,position.left ...
- php socket通信演示以及socket操作类
准备做Java的课程设计,一个通讯录.采用C/S架构.客户端用java FX和Java,服务器端用php,采用socket通信. 下面来讲一讲php的socket通信: 讲之前,得先讲一下TCP/IP ...
- Windows下的一个Nginx 批处理命令行控制台
其实作用很简单,就是为了少输入几个字母,完成对Nginx的控制而已,同时也算是练习了一把bat批处理吧. @echo off&color e&Title Nginx 命令行控制台 cl ...
- 【PostgreSQL-9.6.3】一般视图
PG视图分为两种,一种是物化视图,一种是一般视图.本篇文章主要写一般视图哪些事儿.所谓一般视图,通俗点说,就是由查询语句定义的虚拟表.视图中的数据可能来自一张或多张表. 1. 视图创建语句 CREAT ...
- PHP面向对象考察点
面向对象三大特性 封装 封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义: 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象). ...