发布时间 : 星期五 文章编译原理实验报告一 简单样本语言的词法分析器更新完毕开始阅读
理工大学信息工程与自动化学院学生实验报告
( 2012 —2013学年 第 一 学期 )
课程名称: 开课实验室: 2012 年 12 月 03 日 年级、专业、班 实验项目名称 教师评语 该同学是否了解实验原理: 该同学的实验能力: A.了解□ A.强 □ B.基本了解□ C.不了解□ B.中等 □ C.差 □ B.基本达到□ C.未达到□ 学号 姓名 指导教师 成绩 简单样本语言的词法分析器 该同学的实验是否达到要求: A.达到□ 实验报告是否规: A.规□ A.详细□ B.基本规□ C.不规□ B.一般 □ C.没有 □ 实验过程是否详细记录: 教师签名: 年 月 日 一、 实验目的及容
编译技术是理论与实践并重的课程,而其实验课要综合运用所学的多门课程的容,用来完成一
个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。
调试并完成一个词法分析程序,加深对词法分析原理的理解。
二、实验原理及基本技术路线图(框原理图或程序流程图) 1、 待分析的简单语言的词法
(1) 关键字:
begin if then while do end 所有关键字都是小写。 (2) 运算符和界符:
:= + – * / < <= <> > >= = ; ( ) #
专业资料
(3) 其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=letter(letter| digit)* NUM=digit digit *
(4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、
界符和关键字,词法分析阶段通常被忽略。
2、
各种单词符号对应的种别码
单词符号 begin if then while do end 种别码 1 2 3 4 5 6 10 单词符号 : := > <> <= < >= 种别码 17 18 20 21 22 23 24 letter(letter| digit)* digit digit * * / + -
11 13 14 15 16 = ; ( ) # 25 26 27 28 0 3、
词法分析程序的功能
输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码;
token为存放的单词自身字符串; sum为整型常数。
二、
所用仪器、材料(设备名称、型号、规格等或使用软件)
专业资料
1台PC以及VISUAL C++6.0软件。 三、
实验法、步骤(或:程序代码或操作过程)
(1)程序代码:
#include
int syn,p,m=0,n,row,sum=0;
char *rwtab[6]={\
void scaner() {
for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { }
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { }
token[m++]='\\0'; p--; syn=10;
for(n=0;n<6;n++)
token[m++]=ch; ch=prog[p++]; ch=prog[p]; p++;
专业资料
}
if(strcmp(token,rwtab[n])==0) { }
syn=n+1; break;
else if((ch>='0'&&ch<='9')) { }
else switch(ch) {
{ } p--; syn=11; if(sum>32767)
syn=-1; sum=0;
while((ch>='0'&&ch<='9')) { }
sum=sum*10+ch-'0'; ch=prog[p++];
case'<':m=0;token[m++]=ch;
ch=prog[p++]; if(ch=='>') { }
else if(ch=='=') {
syn=22; syn=21;
token[m++]=ch;
专业资料