《2022年编译原理实验一词法分析程序开发 .pdf》由会员分享,可在线阅读,更多相关《2022年编译原理实验一词法分析程序开发 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、集美大学计算机工程学院实验报告课程名称:编译原理指导教师:付永钢实验成绩:实验编号:实验一实验名称:词法分析程序开发班级:计算 1214姓名:学号:上机实践日期:2014.11上机实践时间:4 学时一、实验目的1、深入理解有限自动机及其应用;2、掌握词法分析程序的开发。;3、掌握根据语言的词法规则构造识别其单词的有限自动机的方法;4、深入理解词法分析程序自动生成原理。二、实验环境Windows7 x64、VC6.0 三、实验原理词法分析是编译过程的第一阶段。它的任务就是对输入的字符串形式的源程序按顺序进行扫描,根据源程序的词法规则识别具有独立意义的单词(符号),并输出与其等价的 Token 序
2、列。有限自动机是描述程序设计语言单词构成的工具,而状态转换图是有限自动机的比较直观的描述方法。我们使用确定的有限状态自动机,简记为DFA。PL/0 的语言的词法分析器将要完成以下工作:(1)跳过分隔符(如空格,回车,制表符);(2)识别诸如 begin,end,if,while 等保留字;(3)识别非保留字的一般标识符,此标识符值(字符序列)赋给全局量id,而全局量 sym 赋值为 SYM_IDENTIFIER。(4)识别数字序列,当前值赋给全局量NUM,sym 则置为 SYM_NUMBER;(5)识别:=,=之类的特殊符号,全局量sym则分别被赋值SYM_BECOMES,SYM_LEQ,SY
3、M_GEQ 等。相关过程(函数)有getsym(),getch(),其中 getch()为获取单个字符的过程,除此之外,它还完成:(1)识别且跳过行结束符;(2)将输入源文件复写到输出文件;(3)产生一份程序列表,输出相应行号或指令计数器的值。下面给出能够识别PL0 语言中各类单词的DFA:名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 11 页 -入口出错识别 PL0 单词的 DFA 表示其他S 字母标识符状态,INID 数字数字状态,INNUM 数字=,:=,=,printf(8,%sn,yytext);printf(9,%sn,yytext);printf(10,%sn,y
4、ytext);=printf(12,%sn,yytext);(printf(13,%sn,yytext);)printf(14,%sn,yytext);printf(15,%sn,yytext);printf(16,%sn,yytext);printf(17,%sn,yytext);,printf(18,%sn,yytext);printf(19,%sn,yytext);:=printf(20,%sn,yytext);%#include int main()yylex();return 0;yywrap()return 1;2、C 程序#include stdio.h#include coni
5、o.h#include string.h 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 11 页 -void main()int i=0,j;int k1=0,k2=0;char table1010=var,if,then,else,while,for,begin,writeln,procedure,end;char c;char t20=0;/缓冲,用于存放临时串学习相关编译原理第一部分实验内容 Cin.txt,r,stdin);c=getchar();while(c!=EOF)if(c=|c=n|c=t)c=getchar();else if(c=a&c=A&c=a&c=A
6、&c=0&c=9)ti+=c;c=getchar();if(c=|c=n|c=t|c=;)for(j=0;j10;j+)if(strcmp(t,tablej)=0)printf(%d,%sn,j+21,t);k1=1;/不是保留字标志break;if(k1=0)printf(1,%sn,t);/标识符if(c=;)printf(17,;n);c=getchar();else printf(100,errorn);for(j=0;j=0&c=0&c=9)ti+=c;c=getchar();if(c=|c=n|c=t|c=;)printf(2,%sn,t);if(c=;)printf(17,;n)
7、;for(j=0;j)c=getchar();if(c=|c=n|c=t)printf(8,n);else if(c=)c=getchar();if(c=|c=n|c=t)printf(12,=n);else printf(100,errorn);else printf(100,errorn);else if(c=)c=getchar();if(c=|c=n|c=t)printf(9,|c=)if(c=)名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 11 页 -k2=1;c=getchar();if(c=|c=n|c=t)if(k1=0)printf(10,n);else pr
8、intf(11,=n);else printf(100,errorn);else printf(100,errorn);else if(c=+)c=getchar();if(c=|c=n|c=t)printf(3,+n);else printf(100,errorn);else if(c=-)c=getchar();if(c=|c=n|c=t)printf(4,-n);else printf(100,errorn);else if(c=*)c=getchar();if(c=|c=n|c=t)printf(5,*n);else printf(100,errorn);名师资料总结-精品资料欢迎下载
9、-名师精心整理-第 8 页,共 11 页 -else if(c=/)c=getchar();if(c=|c=n|c=t)printf(6,/n);else printf(100,errorn);else if(c=)c=getchar();if(c=|c=n|c=t)printf(7,=n);else printf(100,errorn);else if(c=()c=getchar();if(c=|c=n|c=t)printf(13,(n);else printf(100,errorn);else if(c=)c=getchar();if(c=|c=n|c=t)printf(14,)n);el
10、se printf(100,errorn);else if(c=)c=getchar();if(c=|c=n|c=t)printf(15,n);名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 11 页 -else printf(100,errorn);else if(c=)c=getchar();if(c=|c=n|c=t)printf(16,n);else printf(100,errorn);else if(c=;)c=getchar();if(c=|c=n|c=t)printf(17,;n);else printf(100,errorn);else if(c=)c=getc
11、har();if(c=|c=n|c=t)printf(18,n);else printf(100,errorn);else if(c=)c=getchar();if(c=|c=n|c=t)printf(19,n);else printf(100,errorn);名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 11 页 -else if(c=:)c=getchar();if(c=)c=getchar();if(c=|c=n|c=t)printf(20,:=n);else printf(100,errorn);else printf(100,errorn);else printf(100,errorn);c=getchar();fclose(stdin);/关闭文件 名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 11 页 -