欢迎来到天天文库
浏览记录
ID:31205509
大小:127.57 KB
页数:14页
时间:2019-01-07
《实编译原理验一词法分析程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、华北水利水电学院编译原理—实验报告一、实验目的通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解,深刻理解词法分析的整个过程,提高词法分析方法的实践能力。二、实验要求(1)从源程序文件中读取有效字符和并将其转换成二元组机内表示形式输岀。(2)掌握词法分析的实现方法。(3)实验要求独立完成,不允许有抄袭现象。(4)实验完成后,要上交实验报告(包括源程序清单)。三、实验内容1、主程序设计考虑:主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。id和ci数组分别存放标识符和常数;还
2、有一些为造表填表设置的变量。主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。2)词法分析过程考虑该过程取名为lexical,它根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词类,产生类号。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未岀现过,将标识符按顺序填入数组id中,将常数存入数组中ci中,并记录其在表屮的位置。3)功能要求输岀源程序对应的二元组;对错误单
3、词能够报错,并提示出错误所在行;常量和变量要求存在符号表中;注:所有识别出的单词都用二元组表示。第一个表示单词的种类。关键字的t=l;标识符的t=2;常数t=3;运算符t=4;界符t=5o第二个为该单词在各自表中的指针或内部码值(常数表和标识符表是在编译过程中建立起来的。其i值是根据它们在源程序中出现的顺序确定的)。关键字和特殊符号表格如2单词12345678910代码名字intcharfloatvoidconstifelsedowhilescanf单词代码11121314151617181920名字printfret
4、urnmain+—*/%=单词代码21222324252627282930名字—>=<=&&II!■单词代码31323334353637383940名字(){}■9a4++—将词法分析程序设计成独(入口)立一遍扫描源程序的结构。其主流程图如下:#include”词法分析・h”四、程序源代码#includenstdafx.hM#include"词法分析Dlg.h"//1213141516#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FIL
5、E[]=_FILE#endif#defineBUFFERSIZE1200#defineletter1#definedigit0#definenotld-1#defineksize21#definessize25////////〃////〃////〃////〃///////////〃////〃///////////〃/////////////////char*k[ksize]二{“main”,”int”,“float”,“double”,“for”,”while”,”struct;'doTcharTifV'elseTre
6、tuni”,”voidTscanfVprintTcoutTcinTendl”,"include",''iostream","define"};1718192021“[,fH]“I!It
7、.//22charbuffer[BUFFERSIZE]={,H,};intplace[BUFFERSIZE][2];charch;charstrToken[100]={,H,};intpp=0;char*biaoshifu[100];intbiao=0;char*constt[100];intcon=0;BOOLCMyDlg::OnIn
8、itDialog(){CDialog::OnInitDialog();//AddMAbout.menuitemtosystemmenu.//IDM_ABOUTBOXmustbeinthesystemcommandrange.ASSERT((IDM_ABOUTBOX&OxFFFO)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX9、E);讦(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTif(!strAboutMenu.IsEmpty())1Param);m_StatusBar.SetPaneInfo(n,array[n],0,29pSysMenu->AppendMe
9、E);讦(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTif(!strAboutMenu.IsEmpty())1Param);m_StatusBar.SetPaneInfo(n,array[n],0,29pSysMenu->AppendMe
此文档下载收益归作者所有