编译原理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》
实验报告
实验一词法分析设计
一、实验目的
(1)深刻理解程序语言编译系统的结构及各部分的功能。
(2)熟练掌握设计和构造程序语言编译系统的基本原理和技术。
(3)能独立编写清晰、工整、结论正确的编译原理的源程序。
(4)能学会上机进行正确调试,并进行程序修改。即培养发现程序错误,排除错误的能力和经验。
二、功能描述:
本程序实现了一个最简单的C语言词法分析器的功能,它的主要任务是通过文件操作读入一个C语言的源程序,并将其生成为一个个单词符号并输出。对于不符合C语言词法规范的标识符,本程序还可给出简单的报错及错误定位功能。
三、程序结构描述:
本程序主要使用了如下相关函数:
intIskey(string c) //此函数用于判断参数所传来的字符串C是否是C语言关键字,若是关//键字,则函数返回1,否则返回0.
intIsLetter(char c) //此函数用于判断参数所传来的字符C是否是字母,若是c是字母,则//函数返回1,否则返回0.
intIsDigit(char c) //判断是否为数字,是则返回1,否则返回0.
intInsertId(string s) //将arr中的标示符插入符号表并且返回符号表的指针intInsertConst(string s) //将arr中的常实数插入常数表并且返回常数表的指针
void analyse(FILE *fpin) //此函数是程序的实现词法分析功能的主要函数,通过文件指针读取文件,并根据依据算法调用以上各函数来进行词法分析
四、算法描述(程序总体执行流程图)。
1、程序框架:
1)初始化;
2)移进下一字符
3)循环判断整体:查找标识符或关键字;判断是否为关键字或标识符,并进行相应的移进作判断是否为算符;断是否为关系运算符;循环判断常数;若果换行,则行加一,列清零;错误。
2、总体执行流程图
总体执行流程图
五、程序的测试方法和测试结果。
测试准备:将文件1.c放置于在C盘目录下,文件内容为:if i=0 then n++; a﹤= 3b %); 开始测试:运行程序,按程序要求输入源代码所在的目录和文件名。
程序测试结果:
五、实验总结:
1、程序的特点:
本程序以C++为工具语言,以VC60为平台,构造了C语言的简单词法分析器;结构清晰,函数调用关系明确,并且利用制表符,使结果输出相对比较整齐美观。
2.不足:
由于时间有限,本程序尚不能在分析时跳过注释,且在分析预处理方面存在欠缺。
3.收获与体会:
本次实验我最大的收获就是加深了对词法分析器的理解,对其算法有了更清晰的认识。而且通过此次上机实践,不仅锻炼了自己的编程能力,更加深了对词法分析细节处理方面的了解。同时认识到自己实践方面的不足,需要加强锻炼自己的编程能力。
六、程序源码:
#include <iostream>
#include<string>
using namespace std;
#define MAX 32
charch =' ';
int line=1,row=0;
//关键字表单词种别码1
string
key[32]={"auto","break","case","catch","char","class","const","continue","default","delete","do","
double",
"else","enum","float","for","if","int","long","new","private","protected","public","register","return ","short","static",
"struct","switch","this","void","while"};
//标示符表单词种别码2
string Identifier[200];
//常数表单词种别码3
string Constant[50];
//算术运算符表单词种别码4
string Operator[4]={"+","-","*","/"};
//界符表单词种别码5
string Delimiter[11]={";","(",")","[","]",",",".","{","}","!","\""};
//关系运算符表单词种别码6
stringR_operators[]={"<","<=","==",">",">="};
//关键字判断
intIskey(string c){
inti;
for(i=0;i<MAX;i++) {
if(key[i].compare(c)==0) return 1;
}
return 0;
}
//判断是否为字母
intIsLetter(char c) {
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0;
}
intIsDigit(char c){ //判断是否为数字
if(c>='0'&&c<='9') return 1;
else return 0;
}
//将arr中的标示符插入符号表并且返回符号表的指针intInsertId(string s){
for(inti=0;i<200;i++)