java词法分析器实验报告_词法分析器实验报告(JAVA)
实验一、词法分析实验
商业软件工程专业 张树恒 201506110093
一、实验目的
通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解。
二、实验内容和要求
在原程序中输入源代码
对字符串表示的源程序
从左到右进行扫描和分解
根据词法规则
识别出一个一个具有独立意义的单词符号
以供语法分析之用
发现词法错误,则返回出错信息
在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。
识别关键字:main if int for while do return break continue,该类的单词码为1.
识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
运算符:+、-、*、/、=、>、=、<=、!=
分隔符:,、;、{、}、(、)
常数,如123,4587
各种单词符号对应的种别码。
输出形式:
二元式
– (单词种别,单词自身的值)
单词种别,表明单词的种类,语法分析需要的重要信息
– 整数码
关键字、运算符、界符:一符一码
标识符:10, 常数:11
单词自身的值
– 标识符token、常数sum
– 关键字、运算符、界符token
三、实验方法、步骤及结果测试
1.源程序名:编译原理实验报告中源程序名算法分析.c
可执行程序名:编译原理实验报告.exe
2.原理分析及流程图
3.主要程序段及其解释:
import java.awt.*;
import java.util.Scanner;
/**
* Created by s2002 on 2016/9/30.
*/
public class com {
public static void main(String[] args) {
//限制字符串最大值
final int MAX_LEN = 100;
//关键字
String[] key_word = new String[]{"begin","end","if","then","while","do"};
//录入用户输入
Scanner input = new Scanner(System.in);
System.out.print("Please input a string :");
String uString = input.nextLine();
char[] analyseData = new char[MAX_LEN];
int index = 0, key = 0;
List list = new List();
do {
String compareStr = null;
char temp = uString.charAt(index);
list = extactCharacters(temp, analyseData, key_word, uString, index, compareStr);
if (list.getItemCount() == 0) {
index++;
continue;
}
// 规定List的第一个元素为index,第二个元素为key
index = Integer.parseInt(list.getItem(0));
key = Integer.parseInt(list.getItem(1));
String words = list.getItem(2);
System.out.println("< " + key + " ," + words + " >");
} while (key != 0);
}
public static List extactCharacters(char temp, char[] analyseDate, String[] keywords, String uString, int index,
String compareStr) {
int keyID = -1, m = 0;
List list = new List();
//判断下一个读入的字符是否为空格,若读取到空格则跳过,提取下一个字符进行判断
while (temp != ' ') {
//判断当前字符是字母或者数字和字母的组合
if (temp >= 'a' && temp <= 'z') {
m = 0;
// 当读取到不是大小写字母或者数字时候判断为一个单词读取完成
while (temp >= 'a' && temp <= 'z' || temp >= 'A' && temp <= 'Z' || temp >= '0' && temp <= '9') {
analyseDate[m++] = temp;
compareStr += temp + "";
temp = uString.charAt(++index);
}
// 与读取出来的字符判断是否为关键字
compareStr = compareStr.substring(4);
for (int i = 0; i
if (compareStr.equals(keywords[i])) {
keyID = i + 1;
list.add(index + "");
list.add(keyID + "");
list.add(compareStr);
return list;
}
}
//若为非关键字就当作为标识符
keyID = 10;
list.add(index + "");
list.add(keyID + "");
list.add(compareStr);
return list;
}
//判断当前字符是否为数字
else if (temp >= '0' && temp <= '9') {
m = 0;
String tempTokens = null;
// 对后面的字符进行判断是否为数字
while (temp >= '0' && temp <= '9') {
analyseDate[m++] = temp;
tempTokens += temp;
temp = uString.charAt(++index);
}
// 不是数字则返回种别码,结束当前方法
keyID = 11;
tempTokens = tempTokens.substring(4);
list.add(index + "");
list.add(keyID + "");
list.add(tempTokens + "");
return list;
}
m = 0;
//判断当前字符是否为其他关系运算符
String token = null;
switch (temp) {
case '
// String token = null;
analyseDate[m++] = temp;
token += temp;
if (uString.charAt(++index) == '=') {
analyseDate[m++] = temp;
keyID = 22;
token += uString.charAt(index++);
} else if (uString.charAt(++index) == '>') {
analyseDate[m++] = temp;
keyID = 21;
token += uString.charAt(index++);
} else {
keyID = 23;
}
list.add(index + "");
list.add(keyID + "");
token = token.substring(4);
list.add(token);
return list;
case '>':
analyseDate[m++] = temp;
token += temp;
if (uString.charAt(++index) == '=') {
keyID = 24;
analyseDate[m++] = temp;
token += uString.charAt(index++);
} else {
keyID = 20;
}
list.add(index + "");
list.add(keyID + "");
token = token.substring(4);
list.add(token);
return list;
case ':':
analyseDate[m++] = temp;
token += temp;
if (uString.charAt(++index) == '=') {
keyID = 18;
// analyseDate[m++] = temp;
analyseDate[m++] = uString.charAt(index);
token += uString.charAt(index++);
} else {
keyID = 17;
}
list.add(index + "");
list.add(keyID + "");
token = token.substring(4);
list.add(token);
return list;
case '*':
keyID = 13;
break;
case '/':
keyID = 14;
break;
case '+':
keyID = 15;
break;
case '-':
keyID = 16;
break;
case '=':
keyID = 25;
break;
case ';':
keyID = 26;
break;
case '(':
keyID = 27;
break;
case ')':
keyID = 28;
break;
case '#':
keyID = 0;
break;
default:
keyID = -1;
break;
}
analyseDate[m++] = temp;
list.add(++index + "");
list.add(keyID + "");
list.add(temp + "");
return list;
}
return list;
}
}
4.运行结果及分析
输入源代码:begin x:=0; end#
符合个字符的单词码
四、实验总结
学会编写一个简单的词法分析程序,学会了利用词法分析程序分析源代码,逐个单词进行分析拆分,把标识符,保留字区分,并且能识别出空格,并把数据能从文件中读出来,对代码的理解更加的深刻。
java词法分析器实验报告_词法分析器实验报告(JAVA)相关推荐
- 南邮java大作业实验报告_南京邮电大学java第三次实验报告
实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...
- 光纤传感器实验模块_光纤传感器实验报告.doc
<传感器原理>课程实验 光强调制型光纤位移传感器测量位移和粗糙度实验 一.实验目的: 了解光纤位移传感器的工作原理 了解光纤位移传感器的输出特性 加深对传感器一些主要静态性能指标的理解 二 ...
- mysql索引 实验报告_索引实验报告
学 生 实 验 报 告 课程名称 商务数据库应用 实验成绩 实验项目名称 索引 批阅教师 实验者 学号 专业班级 实验日期 2012-12-6 一.实验预习报告(实验目的.内容,主要设备.仪器,基本原 ...
- mysql的安全性实验报告_数据库实验报告3-SQL Server 安全性验证
数据库实验报告 JNU本科实验报告专用纸 课程名称 数据库上机实验 成绩评定 实验项目名称 SQL Server 安全性验证 指导教师 实验项目编号 08060113 实验项目类型 验证性 实验地点 ...
- 眼图观测实验报告_眼图实验报告.docx
眼图实验报告 眼图实验报告 篇一:基带信号眼图实验实验报告 通信原理实验报告 实验名称:数字基带信号的眼图实验 实验时间:XX年12月11日 指导老师: 应娜 学 院: 计算机学院 班 级网络工程) ...
- 光纤传感器实验模块_光纤传感器实验报告
格式 专业资料整理 实验报告评分: 09 级 6 系姓名:安森松学号 :PB09210345 实验题目: 光纤传感器 实验目的: 掌握干涉原理,自行制作光线干涉仪,使用它对某些物理量进行测量, 加深对 ...
- 单片机广告灯实验总结_单片机实验三(广告灯实验)分析报告.ppt
微机原理与接口技术(A)实验三 广告灯实验 1.状态信息窗口 2.程序区与数据区 3.智能一键通 4.智能一键通设置状态窗口 5.文件更新按钮 6.复位目标板 7.操作状态窗口 8.菜单与工具条 9. ...
- 数据结构三元组实验报告_数据结构实验报告
实验一 约瑟夫问题 实验学时: 3 学时 实验类型:设计 实验要求:必修 一.实验目的 熟练掌握线性链表的基础知识: 能够使用 C++ 或其他程序设计语言编程实现线性链表: 能够使用线性链表构造正确而 ...
- java编写三角形问题_软件测试实验1:为三角形问题编写一个Java程序,并用Junit测试程序...
实验报告 实验内容: 1.Install Junit(4.12), Hamcrest(1.3) with Eclipse 2.Install Eclemma with Eclipse 3.Write ...
最新文章
- 孩子、老人与海豚,如何用 AI 伴他们走出孤独
- JDK 16 GA 发布,你还停留在JDK 8吗?
- swift 语言 linux,苹果发布Swift 2.2编程语言:支持Ubuntu Linux系统
- ajax formdata提交上传,Ajax提交用FormData()上传文件
- 一段文字,写给合唱团即将分别的我们
- 将前端文件和Go程序打包
- python3安装_Python 3.8.2安装教程
- c语言栈的实现以及操作_python模拟栈的操作实现非递归方式的快速排序算法
- 微信开发,调用js-SDK接口
- 位置变量示例_shell脚本
- php正则判断括号中的,PHP实现正则匹配所有括号中的内容
- Android蓝牙打印机打印图片文字
- python 运动模糊 退化模型 点扩散函数 逆滤波与维纳滤波
- win10连不上网,“网络重置”后,网络适配器出现感叹号,右下角WLAN消失,网络连接是空白。
- 为什么 call 比 apply 快?
- 爬虫晋江小说python_python 爬虫入门之爬小说
- 【Windows】Windows下通过图形界面安装MySQL数据库
- python抓取经典评论_通过Python抓取天猫评论数据
- Android数据加密DES、3DES、AES
- dokuwiki登录设置