欢迎来到天天文库
浏览记录
ID:18534359
大小:107.50 KB
页数:8页
时间:2018-09-19
《实验一 词法分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验名称:词法分析器设计专业:计算机科学与技术姓名:李玉坤学号:200911810编译原理实验报告词法分析器设计一.实验要求1、从源程序文件中读取有效字符和并将其转换成二元组机内表示形式输出。2、掌握词法分析的实现方法。二.实验内容1、主程序设计要求:(1)主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。(2)id和ci数组分别存放标识符和常数;还有一些为造表填表设置的变量。(3)主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。2、词
2、法分析过程要求:该过程取名为lexical,它根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词类,产生类号。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数存入数组中ci中,并记录其在表中的位置。注:所有识别出的单词都用二元组表示。第一个表示单词的种类。关键字的t=1;标识符的t=2;常数t=3;运算符t=4;界符t=5。第二个为该单词在各自表中的指针或内部码值(常数表和标识符表是在编译过程中建立起来的。其i值是根据它
3、们在源程序中出现的顺序确定的)。关键字和特殊符号表格如下:单词代码12345678910名字intcharfloatvoidconstifelsedowhilescanf单词代码11121314151617181920名字printfreturnmain+–*/%=单词代码21222324252627282930名字==><!=>=<=&&
4、
5、!7编译原理实验报告单词代码31323334353637383940名字(){};,“‘++--将词法分析程序设计成独立一遍扫描源程序的结构。其主流程图如下:图1词法分析程序流程图三.程序设计思
6、想及实现步骤设计思想:本程序使用MFC可视化程序设计实现,采用vs2010编译环境。通过Eidt控件输入程序代码,点击按钮启动词法分析,将结果显示在CListBox控件中。实现步骤:1、为程序各变量设计存储形式,具体设计如下所示:CStringm_strToken;读入的程序代码CStringm_strCodes;得到的一个单词或符号7编译原理实验报告charm_ch;字符变量,存放最新读进的源程序字符intm_nLocat;查找时的位置intm_nId;标识符表位置intm_nDigit;常数表中的位置CStringWordShee
7、t[WORD_LEN];关键字表CStringIdSheet[WORD_LEN];标识符表CStringDigitSheet[WORD_LEN];常数表2、为程序设计各个过程,具体设计如下所示:voidGetBC(void);检查空格符,并将其舍弃voidConcat(void);连接字符BOOLIsLetter(void);判断输入的是否为字符BOOLIsDigit(void);判断输入的是否为数字intReserve(void);查找保留字表,返回在表中对应的位置voidRetract(void);回退一个字符得到单词intIns
8、ertId(void);将单词插入标识符表/intInsertConst(void)将数字插入常数表3、对各个过程进行实现;4、调试运行并检验实验结果,结果如图1.1所示:图1.1词法分析结果图7编译原理实验报告四.程序源码1、各过程的实现:7编译原理实验报告voidCAnalysisWordsDlg::GetChar(void){//得到下个输入字符UpdateData();m_ch=m_strCodes.GetAt(m_nLocat);m_nLocat++;}voidCAnalysisWordsDlg::GetBC(void){/
9、/检查空白符if(m_ch=='')GetChar();}//连接字符voidCAnalysisWordsDlg::Concat(void){m_strToken+=m_ch;}//是否是字符BOOLCAnalysisWordsDlg::IsLetter(void){if(m_ch>='a'&&m_ch<='z')returnTRUE;elseif(m_ch>='A'&&m_ch<='Z')returnTRUE;returnFALSE;}//是否是数字BOOLCAnalysisWordsDlg::IsDigit(void){if(m_
10、ch>='0'&&m_ch<='9')returnTRUE;returnFALSE;}////查找保留字表intCAnalysisWordsDlg::Reserve(void){for(inti=1;i<41;i++){
此文档下载收益归作者所有