微智科技网
您的当前位置:首页编译原理-实验1

编译原理-实验1

来源:微智科技网
 《编译原理》 实验报告 项目名称 词法分析程序设计与实现 专业班级 学 号 姓 名 实验成绩: 批阅教师: 年 月 日 实验1《词法分析程序设计与实现》

实验学时: 2 实验地点: 实验日期:

一、实验目的

加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 二、实验内容

自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程语言和编程工具。

从输入的源程序中,识别出各个具有意义的单词,即关键字、标识符、常数、运算符、界符。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)

三、实验方法

算法的基本任务是从字符串表示的源程序中识别出具有意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 主程序初始包括以下两个方面: ⑴ 关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:

Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};

图3-1

(2)程序中需要用到的主要变量为syn,token和sum 扫描子程序的算法思想:

首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。

四、实验步骤

1. 定义目标语言的可用符号表和构词规则;

2. 依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束; 3. 对正确的单词,按照它的种别以<种别码,值>的形式保存在符号表中; 4. 对不正确的单词,做出错误处理。 五、实验结果

输入begin x:=9: if x>9 then x:=2*x+1/3; end # 显示结果如下:

六、实验结论

该词法分析器可以进行输入、预处理;关键字的识别;标识符的识别、常数的识别、算

符和界符的识别等。 #include #include #include char prog[80],token[8]; char ch;

int syn,p,m=0,n,row,sum=0;

char *rwtab[6]={\"begin\

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++)

if(strcmp(token,rwtab[n])==0) {

token[m++]=ch; ch=prog[p++]; ch=prog[p]; p++;

}

}

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=='=') { } else

syn=22; token[m++]=ch; syn=21; token[m++]=ch;

{ } break;

syn=23; p--;

case'>':m=0;token[m++]=ch;

ch=prog[p++]; if(ch=='=') { } else { } break;

syn=20; p--; syn=24; token[m++]=ch;

case':':m=0;token[m++]=ch;

ch=prog[p++]; if(ch=='=') { } else { } break;

syn=17; p--; syn=18; token[m++]=ch;

case'*':syn=13;token[0]=ch;break; case'/':syn=14;token[0]=ch;break; case'+':syn=15;token[0]=ch;break;

case'-':syn=16;token[0]=ch;break; case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; case'\\n':syn=-2;break; default: syn=-1;break; }

void main() {

p=0; row=1;

cout<<\"Please input string:\"<while(ch!='#'); p=0; do {

scaner(); switch(syn) {

case 11: cout<<\"(\"<case -1: cout<<\"Error in row \"<case -2: row=row++;break;

default: cout<<\"(\"<}

}

}

while (syn!=0);

七、实验小结

词法分析的基本任务是从字符串表示的源程序中识别出具有意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解,让我了解到如何设计、编制并调试词法分析程序;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。比如:main()函数中,用cin>>ch;语句得到ch值的话,给定源程序的结果第一行得到的是(10,beginx),因为得到的字符串中省略了空格,改用cin.get(ch);问题便解决了。

因篇幅问题不能全部显示,请点此查看更多更全内容