编译原理实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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++)

相关文档
最新文档