词法分析-编译原理-词法分析1、 实验内容或题目设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。2、实验目的与要求用C语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。3、 实验步骤与源程序 ⑴ 实验步骤1.待分析的简单语言的词法①关键字begin if then while do end 所有的关键字都是小写②运算符和界符: = + - * / < <= > >= = ; () # ③其他单词时标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter|digit)*NUM=digit digit*④空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。
2.各种单词符号对应的种别码单词符号 种别码 单词符号 种别码begin 1 : 17if 2 := 18then 3 < 20while 4 <> 21do 5 <= 22end 6 > 23letter(letter|digit) * 10 >= 24digit digit* 11 = 25+ 13 ; 26- 14 ( 27* 15 ) 28/ 16 # 0
3.词法分析程序的功能输入:所给文法的源程序字符串。输出:二元组(syn, token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。例如:对源程序 begin x:=9 ; if x>0 then x:=2*x+1/3; end # 的源文件,经词法分析后输出如下序列:(1,begin)(10,’x’)(18,:=)(11,9)(26,;)(2,if)…
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描单词符号的第一个字符种类,拼出相应的单词符号。
4.主程序示意图如下:①关键字表的初值 关键字作为特殊表示符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:char *rwtab[6]={“begin”,”if”,”then”,”while”,”do”,”end”};②程序中需要用到的主要变量为syn ,token和sum。
5.扫描子程序的算法思想 首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来存放整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程164
词法分析-编译原理-词法分析⑵ 源代码# include
# include char prog[80]={"begin r12 #"},token[8];char ch;int syn,p=0,m,n,sum=0;char *rwtab[6]={"begin","if","then","while","do","end"};void scaner();
main(){ p=0; printf("\n please input string:\n"); int i=0; p=0; do{ scaner(); switch(syn) { case 11:printf("(11,%d)",sum);break; case -1:printf("error!");break; default:printf("(%d,%s)",syn,token); } }while(syn!=0);}
void scaner(){ for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') ch=prog[p++]; if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { m=0; while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else { if(ch>='0'&&ch<='9') { while(ch>='0'&&ch<='9') { sum=sum*10+(ch-'0'); ch=prog[p++]; } syn=11; } else{ switch(ch)lwfree.cn else { syn=20; } break; case '>': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; } break; case ':': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18; token[m++]=ch; } else { syn=17; } break; 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; default:syn=-1; } } }
}
4、 测试数据与实验结果(可以抓图粘贴)1.对源程序 begin r12 # 2.对源程序 begin if x>0 then x=3 end # 3.对于源程序begin do x++ while x>0 end #
5、 结果分析与实验体会 本次编译原理的实验做的是词法分析程序的编写。词法分析算法的基本任务是从字符串标识的源程序中识别出具有独立意义的单词符号。 词法分析程序是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。这个程序在书上有了C语言程序框架,但是其中细节部分没有具体描述,需要我们添加进去。程序框架由c语言描写,还是比较好理解的。但是其中也有一些问题出现,没有做到十分的完善。 本次编译原理程序是一个基础,后续还有语法分析,语义分析等。这次的实验课让我们更加的了解了编译原理,将课本上的理论化成实践,我们应该继续努力好好学习这门课程