1、词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)识别保留字:if、int、else、for、while、do、return、break、continue;单词种别码为1。其他的都识别为标识符, 标识符由字母开头,后面可以是数字、字母和下划线;单词种别码为2。常数为无符号整形数, 无符号的整数由数字开头,后面只包含数字;单词种别码为3。运算符包括:+、-、*、/、=、=、 ;单词种别码为4。分隔符(界符)包括:,、;、(、); 单词种别码为5。程序输入/输出示例:如源程序为C语言。输入如下一段:main()int a, b;a
2、 = 10; b = a + 20;三 实验任务要求输出如图:实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)一实验步骤1.建立一个对话框的C+工程,取工程名为zhaoying。2.输入代码3.执行代码二 算法描述#include string.hstdlib.hstruct test /保留字 char name10; int num;struct oper/运算符与关系运算符 char name4;struct cut /分隔符 char name2;/定义全局变量struct test test9= main,1,if,2,int,3,for,4,while,5, do
3、,6,retuen,7,break,8,continue,9 ;struct oper oper11=+,41,-,42,*,43,/,44,=,45,46, ,47,48,49,=,50,!,51struct cut cut6=,61,;,62,63,64,(,65,),66/包含的函数void menu();/菜单void scansource();/查看源文件void rule();/查看输出规则void analyse();/分析结果显示void explain();void getch(char ch); /读取为字母void getnum(char ch); /读取为数字void
4、getspace(char ch); /读取制表符类void getelse(char ch); /其他字符char ch;char str10;int k=0,i=0;char sourcefile20; /源文件名char objectfile20; /目标文件名FILE *fp;FILE *hp;int main(int argc,char *argv) int choice; /显示菜单 menu(); printf(输入进行词法分析的源文件名:); scanf(%s,sourcefile);n输入分析结果存入的文件名:,objectfile);n输入选项:%d,&choice); f
5、or(; ;) switch(choice) case 1: scansource(); break; case 2: rule(); case 3: analyse(); case 4: explain(); case 5: exit(1); printf(nn menu();输入选择项: scanf( return 0;void menu()/-/n 词法分析器 n 1.查看源文件: n 2.符号种别码: 3.分析结果: 4.程序说明: 5.退出程序:/-/nvoid scansource() FILE *fp; char ch; if(fp=fopen(sourcefile,r)=NUL
6、L)文件打开错误或源文件不存在 !n exit(1); ch=fgetc(fp); while(ch!=EOF) putchar(ch); ch=fgetc(fp); fclose(fp);void rule() int i;保留字及其对应种别码: for(i=0;i=a)&(chAZ) getch(ch); else if(ch09) /如果读取的是数字 getnum(ch);else if(ch= )|(ch=rnt getspace(ch); else /其他情况 getelse(ch); k=0; strk=0 while(ch!=EOF); /关闭文件 fclose(hp);void
7、 explain()printf(n提示:本程序是一个进行标准C语言词法分析的程序,在本程序执行的开始,你会看到菜单n为了是程序正确的运行,请按照提示进行正确的输入,比如:输入错误的源文件名会导致n程序因找不到源文件而出错,所以请输入正确的文件名并将源文件与本程序放在同一目录n下,结果将会存入输入的目标文件中,如果目标文件不存在,程序将会自动建立同名文件n可以再程序中或者查看目标文件浏览词法分析结果,谢谢您的使用 !void getch(char ch) for(; strk=ch; str+k=if(!(ch) fseek(fp,-1L,1); if(strcmp(str,testi.nam
8、e)=0) /测试是否为保留字 printf( %d,0 )n,testi.num); fprintf(hp, k=0; break;if(k!=0) /否则为变量 printf( 20,%s ) n,str); fprintf(hp,( 20,%s )n void getnum(char ch) if( !(ch) & (ch) ) fseek(fp,-1L,1);( 30,%s ) n fprintf(hp,( 30,%s )n break;void getspace(char ch) if(!(ch=void getelse(char ch) switch(ch) case ,:( 61,0 )n( 62,0 )n( 63,0 )n( 64,0 )n( 65,0 )n)( 66,0 )n+( 41,0 )n-( 42,0 )n*( 43,0 )n/( 44,0 )n strk=ch; str+k= if(ch! fseek(fp,-1L,1); printf( 45,0 )n else if(ch=( 50,0 )n( 46,0 )n( 48,0 )n( 47,0 )n( 49,0 )n( 51,0 )n三 流程四 结论
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1