资源描述:
《实验一 词法分析程序设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、s实验一词法分析程序设计[实验目的]:1.了解词法分析的主要任务。2.熟悉编译程序的编制。[实验内容]:根据某文法,构造一基本词法分析程序。找出该语言的关键字、标识符、整数以及其他一些特殊符号,给出单词的种类和值。[实验要求]:1.构造一个小语言的文法,例如,Pascal语言子集的文法:G[<程序>]:<程序>→<程序首部>;<分程序>.<程序首部>→program<标识符><分程序>→<常量说明部分><变量说明部分><复合语句><常量说明部分>→CONST<常量定义表><常量定义表>→<常量定义><常量定义表>
2、<常量定义><常量定义>→<标识符>=<无
3、符号整数>;<变量说明部分>→VAR<变量定义表><变量定义表>→<变量定义><变量定义表>
4、<变量定义><变量定义>→<标识符表>:<类型>;<标识符表>→<标识符>,<标识符表>
5、<标识符><类型>→integer
6、real
7、boolean
8、char<分程序>→<复合语句><复合语句>→begin<语句序列>end<语句序列>→<语句>
9、<语句序列>;<语句><语句>→<赋值语句>
10、<复合语句>
11、<条件语句><赋值语句>→<标识符>:=<表达式><条件语句>→if<布尔表达式>then<语句>else<语句><表达式>→<表达式>+<项>
12、<表达式>-
13、<项>
14、<项><项>→<项>*<因式>
15、<项>/<因式>
16、<因式><因式>→<标识符>
17、<无符号整数>
18、(<表达式>)<布尔表达式>→<表达式><关系运算符><表达式><关系运算符>→=
19、<
20、<=
21、>
22、>=
23、<><标识符>→<字母>
24、<标识符><字母>
25、<标识符><数字><无符号整数>→<数字>
26、<无符号整数><数字><字母>→a
27、b
28、c
29、d
30、e
31、f
32、g
33、h
34、i
35、j
36、k
37、l
38、m
39、n
40、o
41、p
42、q
43、r
44、s
45、t
46、u
47、v
48、w
49、x
50、y
51、z<数字>→0
52、1
53、2
54、3
55、4
56、5
57、6
58、7
59、8
60、92.设计单词的输出形式,单词的种类和值的表示方法,例如:keywordprogra
61、mdigit1……3.编写词法分析程序cffx.c实现基本的词法分析器,能够分析关键字、标识符、数字、运算符(需要有“==”或“:=”之类需要超前搜索的运算符)以及其他一些符号。实验报告中要说明分析使用的方法。s1.生成并输出单词符号表1keywordprogram……[实验步骤]:1.写出一个小语言的文法,根据情况自由选择C语言或Pascal语言。2.写出该小语言的单词分类情况表。3.编写词法分析程序。4.调试运行程序。5.结果分析。6.撰写实验报告。[实验报告]:1.写出实现的算法。2.画出流程图。3.实验设计过程中出现的问题及解决的方法。4.实验设计
62、过程中的体会。5.给出程序清单。6.给出测试结果。测试的结果举例词法分析源程序举例#include"stdio.h"#include"conio.h"#include"string.h"#include"ctype.h"charsave[20];/*定义暂存函数*/char*p;charcount[200];inttotal;char*sum[5]={"begin","end","integer","program","var"};/*定义5个关键字*/charalpha()/*分析标识符*/{inti,j;schar*opp;i=0;j=0;/*j=0是
63、标识符,j=1是关键字*//*while(isalpha(*p))/*检查是否是字母*/{save[i]=*p;p++;i++;}*/while(isalnum(*p))/*检查是字母还是数字,如果是字母返回1,是数字返回2*/{save[i]=*p;p++;i++;}opp=save;for(i=0;i<5;i++)/*把字母与关键字表核对,如果是关键字就设置j=1*/if(!(strcmp(opp,sum[i])))/*比较两个字符串*/{printf("%dkeyword%s",total,opp);/*识别关键字*/j=1;}if(j==0)p
64、rintf("%dcaptionsign%s",total,opp);/*识别标识符*/p--;/*回退多读进的字符*/}chardigit()/*分析数字*/{inti;i=0;while(isdigit(*p))/*检查是否数字(0-9)*/{save[i]=*p;i++;p++;}printf("%ddigit%s",total,save);p--;}main(){inti,j;total=1;/*计数器等于一*/memset(count,0,200);/*把count所指内存区域的前200个字节设置成字符0*/clrscr();strcpy
65、(count,"programtest;vari,j:inte