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 2083 Fractal 递归 图形打印
题目链接: http://poj.org/problem?id=2083 题目描述: n = 1时,图形b[1]是X n = 2时,图形b[2]是X X X ...
- [USACO 2012 Mar Silver] Landscaping【Edit Distance】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=126 好题啊好题,一开始就输给了这道题的想法! 先把原始状态以及目标状态换 ...
- 设置当前导航栏(navigationController)的标题
一般在有导航navigationController的情况下,要设置页面的标题很简单 self.title = @"测试"; 也可以 self.navigationItem.tit ...
- 230 Kth Smallest Element in a BST 二叉搜索树中第K小的元素
给定一个二叉搜索树,编写一个函数kthSmallest来查找其中第k个最小的元素. 注意:你可以假设k总是有效的,1≤ k ≤二叉搜索树元素个数. 进阶:如果经常修改二叉搜索树(插入/删除操作)并且你 ...
- [转]Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)
前言 结合之前所用的ormlite和hessian,再加上SAE已经支持JAVA,把服务端切换到JAVA,也就有了本文.使用hessian来做数据传输,ormlite来实现客户端与服务端的数据存储,极 ...
- 学习笔记 第十一章 CSS3布局基础
第11章 CSS3布局基础 [学习重点] 了解CSS2盒模型. 设计边框样式. 设计边界样式. 设计补白样式. 了解CSS3盒模型. 11.1 CSS盒模型基础 页面中所有元素基本显示形态为方形 ...
- android环境搭建环境 cordova run android gradle wrapper报错
cordova run android命令报错 Error: Could not find an installed version of Gradle either in Android Studi ...
- mysql 字段包含某个字符的函数
通过sql查询语句,查询某个字段中包含特定字符串: 例子:查询e_book表的types字段包含字符串"3",有下面4种方式 select * from e_book where ...
- 中国版 Office 365 (X-Tenant / Tango) 功能验证报告 - 2 基本步骤
说明: 1. 前期准备 - 在Azure上模拟出生产环境: 包括父域域控.子域域控.父域的Exchange Server.子域的Exchange Server.对Exchange Server, 需要 ...
- leetcode_865. Smallest Subtree with all the Deepest Nodes
https://leetcode.com/problems/smallest-subtree-with-all-the-deepest-nodes/ 给定一颗二叉树,输出包含所有最深叶子结点的最小子树 ...