编译原理词法分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理词法分析实验报告
实验一词法分析
一、实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。
二、实验内容
(1)功能描述:
该程序是实现一个词法分析器,词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是将单词分为五种的方法。
识别关键字:main、if、int、for、while、do、return、break、continue;
单词种别码为1。
标识符:单词种别码为2。
常数:为无符号整形数;单词种别码为3。
运算符:包括:+、-、*、/、=、>、<、>=、<=、!= ;单词种别码为4。
分隔符:包括:,、;、{、}、(、);单词种别码为5。
(2)程序结构描述:
输入:从控制台输入一段源程序代码,对输入的代码进行词法分析,
处理:分离出关键字、标识符、数值、运算符和界符。
输出:在词法分析结果表中输出每个单词所在行号、类型以及它所对应的编码。其中,编码是自定义的,一种类型对应一个编码。词法分析结
果显示在控制台上。
(3)程序设计思路
1、定义编码表,用ArrayList集合存放单词,如:关键字、运算符、分界符。这三种单词是固定的,标示符和数字这两种单词不存放在集合中。编码表是固定的,只需要初始化一次就够了,所以将集合定义为static类型,使其在类加载时,进行一次初始化。
2、static char allstr[] = new char[100000];该数组用于存储用户从控制台输入的所有字符。
3、//从键盘获取一个一个的字符
public char Getchar() {
try {
ch = (char) System.in.read();
} catch (Exception e) {
e.printStackTrace();
}
return ch;
}
4、用while循环遍历allstr数组中存放的字符,判断分离出关键字、标示符、数字、运算符、标示符。
5、Reserve() 遍历编码表,查询单词的编码号。
三、实验过程记录
实验过程中,比较费力的是如何分割出一个一个的单词,定义一个变量j来记录一个单词在allstr数组中的起始位置,变量index来判定一个单词是否到结尾位置。用String类中的subString(str,start,end)方法来截取一个单词。一旦一个单词的下标移动错误,导致后面识别出的单词全都不正确。通过加断点,对程序一步一步的调试,查看j、index变量的值的变化。一步一步的分析,最终得到了正确的运行结果。
测试数据:
main()
{
int a,b;
a = 10;
b = b +a ;
}#
运行结果:
测试数据:
Int abc(){
Int a=5,b=6;
While(a>=0){
a--;
}
}#
运行结果:
==>>>
测试数据:
int a=10,b=5;
if(a>=9)
return b;#
运行结果:
四、主要源代码
//判断是否为字母
public boolean IsLetter(char ch) {
return ng.Character.isLetter(ch);
}
//判断是否为数字
public boolean IsDigit(char ch) {
return ng.Character.isDigit(ch);
}
public int Reserve() {
name = new String(allstr).substring(j, index);// 取子串
for (int i = 0; i < 5; i++)
if (table[i].key.contains(name))
return table[i].code;
return 0;
}
public static void main(String[] args) {
WordAnalyzer a = new WordAnalyzer();
ch = a.Getchar();
int m = 0;
while (ch != '#') {
allstr[index] = ch;
index++;
ch = a.Getchar();}
int k = index;
index = 0;
while (j < k) {
m = j;
//标示符
if (a.IsLetter(allstr[j])) {
while (a.IsLetter(allstr[index]) || a.IsDigit(allstr[index])) {
index++;
}
if (a.Reserve() != 0)
System.out.println("(" + a.Reserve()+","+name+")");
else
System.out.println("(2," +name+ ")");
j = index;