程序实现原理:

将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语言词法分析器的更多相关文章

  1. [改善Java代码]易变业务使用脚本语言编写

    建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...

  2. 使用java语言编写窗口按钮

    使用java语言编写窗口按钮 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import ja ...

  3. Atiitt 使用java语言编写sql函数或存储过程

    Atiitt 使用java语言编写sql函数或存储过程 1.1. java编写sql函数或存储过程的机制1 1.2. Java编写sp的优点1 1.3. 支持java源码,class文件,blog f ...

  4. Fastjson是一个Java语言编写的高性能功能完善的JSON库。

    简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...

  5. 第二次作业利用java语言编写计算器进行四则运算

    随着第一次作业的完成,助教 牛老师又布置了第二次作业:用java语言编写一个程序然后进行四则运算用户用键盘输入一个字符来结束程序显示统计结果.一开始看到这个题目我也着实吓了一跳 因为不知道如何下手而且 ...

  6. 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)

    使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置jdk-15.0.1-免配置路径版提取码:earu免安装版 ...

  7. 提高java编程质量 - (一)易变业务使用脚本语言编写

    脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型:2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3.简单:脚本语言语法比 ...

  8. Java之戳中痛点 - (1)易变业务使用脚本语言编写

    脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型:2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3.简单:脚本语言语法比 ...

  9. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

随机推荐

  1. Qt事件系统之五:事件过滤器和事件的发送

    Qt提供了事件过滤器来实现在一个部件中监控其他多个部件的事件.事件过滤器与其他部件不同,它不是一个类,只是由两个函数组成的一种操作,用来完成一个部件对其他部件的事件的监视.这两个函数分别是 insta ...

  2. DP + 概率 + 贪心 UVA 1456 Cellular Network

    题目传送门 题意:(摘自LRJ<训练指南>) 手机在蜂窝网络中的定位是一个基本问题.假设蜂窝网络已经得知手机处于c1, c2,…,cn这些区域中的一个,最简单的方法是同时在这些区域中寻找手 ...

  3. 利用autotools工具制作从源代码安装的软件 分类: linux 2014-06-02 23:27 340人阅读 评论(0) 收藏

    编写程序(helloworld.c)并将其放到一个单独目录. helloworld.c: #include<stdio.h> int main() { printf("hello ...

  4. hdu 6012 Lotus and Horticulture 打标记

    http://acm.hdu.edu.cn/showproblem.php?pid=6012 我们希望能够快速算出,对于每一个温度,都能够算出它在这n颗植物中,能得到多少价值. 那么,对于第i科植物, ...

  5. 12. binary search Trees

    12. binary search Trees    The search tree data structure supports many dynamic-set operations,inclu ...

  6. Struts1 MVC框架的工作原理

    MVC英文及Model-View-Controller,分别是模型(Model),视图(View)和控制(Controller).MVC模式的目的是实现web系统的职能分工. View:即用户交互界面 ...

  7. 迅为电子HMI人机界面|CAN总线触摸屏

    本文转自迅为:http://www.topeet.com 协议特色: 1. 支持所有 CAN 协议,例如常用的 J1939 和 CANopen 协议. 2. 提供高度开放的 CAN 帧的编辑界面,用户 ...

  8. <jsp:include page="${pageContext.request.contextPath/index.jsp" ></jsp:include> 引发的错误

    路径引发的错误 如下使用项目路径对jsp页面进行获取,会报javax.servlet.ServletException: File "/web/dbwx/web/public/page_to ...

  9. WPF学习- 新建项目后自定义Main()[Type 'App' already defines a member called 'Main' with the same parameter types]

    问题点: 在App.xaml.cs中自己添加Main方法,编译会出现如下报错: 错误 CS0111 类型“App”已定义了一个名为“Main”的具有相同参数类型的成员  错误 Type 'App' a ...

  10. element-ui iview-admin 都是基于vue的ui框架

    element-ui iview-admin 都是基于vue的ui框架