编译实验报告+源代码
- 格式:doc
- 大小:328.50 KB
- 文档页数:25
课程设计报告
( 2013-- 2014年度第1学期)
名称:编译技术课程设计B
题目:简单编译程序的设计与实现院系:计算机系
班级:XXX
学号:XXX
学生姓名:XXX
指导教师:XXX
设计周数:XXX
成绩:
日期:XX 年XX 月
实验一.词法分析器的设计与实现
一、课程设计(综合实验)的目的与要求
1.1 词法分析器设计的实验目的
本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。
1.2 词法分析器设计的实验要求
设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。
单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。
表1-1 单词符号及其内部表示
二、设计(实验)正文
1.词法分析器流程图
2.词法分析器设计程序代码
// first.cpp : 定义控制台应用程序的入口点。//
#include"stdafx.h"
#include
#include
using namespace std;
int what(char a)
{
if((int(a)>=48)&&(int(a)<=57))
{
return 0;//0-9数字
}
else
if((int(a)>=97)&&(int(a)<=122))
{
return 1;//a-z的字母
}
else
{
return 2;//其他的标点符号
}
}
void scan(char a[],int &m,char zc[100][100],int &n)
{
char zh[100];
int b=0,weizhi,r=0;
int zbbm;
//-----------------------------检测整形常数
while(a[m]==' ')
{
cout<<"遇到空格"< m++; } if(what(a[m])==0) { while(what(a[m])==0) { b=b*10+int(a[m])-48; m++; } zbbm=7; cout<<"("< } else //----------------------------------检测字符型 if(what(a[m])==1) { if((a[m]=='b')&&(a[m+1]=='e')&&(a[m+2]=='g')&&(a[m+3]=='i')&&(a[m+4]=='n')& &(what(a[m+5])==2)) { m=m+5; zbbm=1; cout<<"("< }//=====检测begin else if((a[m]=='i')&&(a[m+1]=='f')&&(what(a[m+2])==2)) { m=m+2; zbbm=2; cout<<"("< }//检测if else if((a[m]=='t')&&(a[m+1]=='h')&&(a[m+2]=='e')&&(a[m+3]=='n')&&(what(a[m+4])= =2)) { m=m+4; zbbm=3; cout<<"("< }//检测then else if((a[m]=='e')&&(a[m+1]=='l')&&(a[m+2]=='s')&&(a[m+3]=='e')&&(what(a[m+4])= =2)) { m=m+4; zbbm=4; cout<<"("< }//检测else else if((a[m]=='e')&&(a[m+1]=='n')&&(a[m+2]=='d')&&(what(a[m+3])==2)) { m=m+3; zbbm=5; cout<<"("< }//检测end //----------------------------对未知字符的检测 else { int j=0; while(what(a[m])!=2) { zh[j]=a[m]; m++; j++;