中南大学编译原理实验报告.docx

上传人:文*** 文档编号:68226307 上传时间:2022-12-27 格式:DOCX 页数:71 大小:93.71KB
返回 下载 相关 举报
中南大学编译原理实验报告.docx_第1页
第1页 / 共71页
中南大学编译原理实验报告.docx_第2页
第2页 / 共71页
点击查看更多>>
资源描述

《中南大学编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《中南大学编译原理实验报告.docx(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、中南大学编译原理实验报告班级:计科1205姓名:赵越学号:0909122209实验词法分析程序设计与实现、实验目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采 用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单 的程序段进行词法分析。二、实验内容自定义种程序设计语言,或者选择已有的种高级语言,编制它的词法分 析程序。词法分析程序的实现可以采用任何一种编程语言和编程工具。从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、 常数、运算符、界符。并依次输出各个单词的内部编码及单词符号自身值。(遇 到错误时可显示“Error”,然后跳过错误部分

2、继续显示)三、实验要求:1 .对单词的构词规则有明确的定义;2 .编写的分析程序能够正确识别源程序中的单词符号;3 .识别出的单词以种别码,值的形式保存在符号表中,正确设计和维护 符号表;4 .对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误 提示,保证顺利完成整个源程序的词法分析;四、实验步骤1 .定义目标语言的可用符号表和构词规则;2 .依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;3 .对正确的单词,按照它的种别以种别码,值的形式保存在符号表中;4 .对不正确的单词,做出错误处理。五、设计思路和实现过程本实验是词法分析器,我是用的是MFC实现的,我的设计思

3、路就是按照书上 提示的算法,先将儿个词法分析器所需的基本函数用C+的形式实现,然后使用 循环语句读入输入串的每个字符,然后用ifelse语句实现,具体判断方 式如下:1、如果读入的是字母,那么继续读入,知道读入的字符不是字母或者数字 为止,对照标识符表,如果是标识符,则显示该串及对应标识符;如果不是,则 显示该串和“ $ID”;2、如果读入的是数字,则继续读入,知道不是数字为止,并显示该串和 “$INT”;3、如果读入的是“则分别输出该串和 ASSIGN”,”$PLUS”, SEMICOLON, $LPAR, $RPAR, $LBRACE, $RBRACE”;4、如果读入的是那么继续读入,如果

4、下个是则输出该串和 $POWER;否则输出该串和$STAR,并将指针回退;5、如果独到输入串末尾,则退出。六、错误处理创建一个键,如果读岀的字符不属于以上任何情况,则把此键置为真,通知 程序退出循环,从而实现对错误的处理。七、关键代码1、 void CWordanalysisDlg:GetChar()(ch=m input. GetAt(pointer);pointer+;2、 void CWord_analysisDlg:Concat() (strToken+=ch;3、 void CWord_analysisDlg:GetBC() (while(ch=1)GetChar ();4、 voi

5、d CWord_analysisDlg:Retract() pointer;ch二;5、 int CWord analysisDlg:Reserve() (/if(strcmp(stricken,)int i;for(i=l;i 15;i+)if(strcmp(strToken, Tokeni)=0) return i;return 0;6、bool CWord_analysisDlg:IsLetter() if (cha &ch= A &ch= O & ch= 9) return true;elsereturn false;8、 void CWord_analysisDlg:0nAnalys

6、is() (/ TODO: Add your control notification handler code herem_list. DeleteAllItems();pointer=0;UpdateDataO ;m_input+= 0;while(pointerxx. . . */void AddFirst (int U, int nCh);加入 first 集/bool HaveEmpty (int nVn);判断 f i rst 集中是否有空(T)*/void Fol low(int V);计算千I Iow 集/void AddFol Iow(int V, int nCh, int

7、kind);加入 fol low 集,kind = 0 表加入 fol low 集,kind = 1 加入 first 集/void ShowCo I I ect (struct col I ectNode *col lect);输出 f i rst 或 fol low 集/ void Fi rstFol low() ;/计算 f i rst 和 fol Iow*/void CreateAT() ;/构造预测分析表/void ShowAT();输出分析表/void Identify (char *st);主控程序,为操作方便/分析过程显示操作为本行变换所用,与教程的显示方式不同/void In

8、itStackO ;/初始化栈及符号串/void ShowStack();/显示符号栈中内容/void Pop();栈顶出栈/void Push(int r) ;/使用产生式入栈操作/#i ncIude LL1.hvoid main(void) char todo, ch;I n i t ();I nputVn ();I nputVt ();InputPO ;getchar ();Fi rstFol low();printf (所得first 集为:);ShowCoIlect (fi rst);pr intf (“所得 follow 集为:;ShowCoIlect (foI Iow);Crea

9、teAT 0;ShowAT ();todo 二y;whi IeC y* = todo) (pr intf (n是否继续进行句型分析? (y / n):);todo = getchar ();whileCy != todo & n != todo) (pr intf (n(y / n)?);todo = getchar ();if ( y = todo)(int i;InitStackO ;pr intf (请输入符号串(以#结束):“);ch = getchar ();i = 0;while,# != ch & i MaxStLength)(ifC != ch & n != ch)(sti +

10、 = ch;ch = getchar ();)ifC # = ch & i MaxStLength)(sti = ch;Identify (st);e I seprintf (输入出错! n);1getchar ();void Init()(int i, j;vnNum = 0;vtNum = 0;PNum = 0;for (i = 0; i = MaxVnNum; i+) Vni(X ;for (i = 0; i = MaxVtNum; i+)Vti=(X ;for (i = 0; i MaxRuleNum; i+) (Pi. ICursor = NULL;Pi. rHead = NULL;

11、Pi. rLength = 0;PNum = 0;for(i = 0; i = MaxPLength; i+) bufferi = 1 0, ;for (i = 0; i MaxVnNum; i+)(firsti = NULL;followi = NULL;)for (i = 0; i = MaxVnNum; i+)(for (j = 0; j = MaxVnNum + 1; j+) analyseTablei j = -1;)/返回Vn在Vn表中的位置+100、Vt在Vt表中的位置,7表示未找到*/ i nt IndexCh (char ch) (i nt n;n = 0; /*is Vn?

12、*/whi le(ch != Vnn & 、 != Vnn) n+;ifC 0* != Vnn) return 100 + n;n = 0; /*is Vt?*/whi le(ch != Vtn & 、 != Vtn) n+;if (、 != Vtn) return n;return -1;)/输出Vn或Vt的内容/void ShowChArray(char* collect) (int k = 0;whi Ie( != col lectk) (pr intfC %c 、co I Iectk+); printf (n);)/输入非终结符/void InputVn() (i nt i nErr

13、= 1;int n,k;char ch;whi Ie(inErr) (pr intf (n请输入所有的非终结符,注意:“);pr intf (请将开始符放在第一位,并以#号结束:n); ch =;n = 0;/初始化数组/ whiIe(n MaxVnNum) Vn n+ = 0;)n = 0;whi le(r != ch) & (n MaxVnNum) (if ( != ch & n != ch & -1 = IndexCh(ch)Vn n+ = ch; vnNum+;ch = getchar (): )Vnn =,#,;/以“标志结束用于判断长度是否合法/ k = n; /*k用于记录n以便

14、改Vnn=、0*/ if (# != ch) (if( # != (ch = getchar () (whi le( # != (ch = getchar ()printf(n符号数目超过限制!n);i nErr = 1;cont i nue;) ) /正确性确认,正确则,执行下下面,否则重新输入/ Vnk = 、;ShowChArray (Vn);ch =;whi le( y != ch & n != ch)Iif ( n != ch)Iprintf (输入正确确认? (y/n):);)scanf(%c”, &ch);)if( n = ch) (printf (录入错误重新输入!n);inE

15、rr = 1;) e I se inErr = 0;/输入终结符/ void InputVt() (int inErr = 1;int n, k;char ch;while(inErr)(printf(n请输入所有的终结符,注意:);pr intf (以#号结束:、n);ch =;n = 0:/初始化数组/whiIe(n MaxVtNum)(Vt n+ = 0;)n = 0:whi le(C # != ch) & (n MaxVtNum)(ifC != ch & n != ch & -1 = IndexCh(ch) (Vtn+ = ch;vtNum+;)ch = getchar ();)Vtn

16、 =; /以 u#n 标志结束/k = n; /*k用于记录n以便改Vtn=、0*/if (# != ch)(if ( # != (ch = getchar ()(whi leC # != (ch = getchar ()printf(、n符号数目超过限制!、n);inErr = 1;continue;)/*正确性确认,正确则,执行下下面,否则重新输入*/Vtk = 、;ShowChArray (Vt);ch ;whi leC y != ch & n != ch)(if ( n != ch)(printf (输入正确确认? (y/n):);scanf c, &ch);if C n* = ch)

17、(printf (录入错误重新输入!n);i nErr = 1;1e I se (i nErr = 0;1/产生式输入/ void InputPO (char ch;int i = 0, n, num;printf (“请输入文法产生式的个数:);scanf (%d, &num);PNum = num;getchar () ; /消除回车符*/printf (n请输入文法的%d个产生式,并以回车分隔每个产生式:“,num); pr intf (n);wh iIe (i num) (printf (第%d 个:“,i);/初始化/for(n =0; n MaxPLength; n+) buffe

18、rn二、。;/输入产生式串/ ch 二,;n 二。;while,n != (ch 二 getchar () & n rCursor = IndexCh (buffer3);pt-next = NULL;Pi. rHead = pt;n = 4;while (、 != buffer n)Iqt = (pRNode*)ma I Ioc(s i zeof (pRNode);qt-rCursor = IndexCh (buffer n);qt-next = NULL;pt-next = qt;pt = qt; n+;Pi. rLength = n - 3;i+;/调试时使用/)e I seprintf

19、 (输入符号含非法在成分,请重新输入!、);)/判断产生式正确性/boo I CheckP (char * st) (int n;if (100 IndexCh(st0) return false;ifC!= st ) return false;if O != st2)return false;for (n = 3; 、 != stn ; n +) (if(-1 = IndexCh (st n) return false;) return true;)/*=f i r st & f | | ow二=二=*/ /计算 f j rst 集,U-xx. . . */ void Fi rst(i nt

20、 U)int i, j ;for(i = 0; i PNum; i+)(if (Pi. ICursor = U)(struct pRNode* pt;pt = Pi. rHead;j = 0;while(j pt-rCursor)(/注:此处因编程出错,使空产生式时r length同样是!,故此处同样可处理空产生式/AddFi rst (U, pt-rCursor);break;)e I se(if(NULL = firstpt-rCursor - 100)(First(pt-rCursor);)AddFirst(U, pt-rCursor);if (!HaveEmpty(pt-rCursor

21、)(break;)e I se(pt = pt-next;)j+;)if (j = Pi. rLength) /当产生式右部都能推出空时/ AddFirst(U, -1);/加入first集/void AddFirst (int U, int nCh) /当数值小于 100 时 nCh 为 Vt*/当处理非终结符时,AddFi rst不添加空项(-1)*/struct col I ectNode *pt, *qt;int ch; /用于处理Vn*/pt = NULL;qt = NULL;i f(nCh nVt = nCh) break;e I se (qt = pt;pt = pt-next;

22、)if (NULL = pt)(pt = (struct collectNode *)ma I Ioc(s i zeof(struct col I ectNode); pt-nVt = nCh;pt-next = NULL;i f(NULL = firstU - 100)(firstU - 100 = pt;e I se(qt-next = pt; /*qt指向f i rst集的最后个元素/)pt = pt-next;e I se (pt = firstnCh - 100; while(NULL != pt) (ch = pt-nVt;if (-1 != ch) AddFi rst(U, ch

23、);pt = pt-next;)/判断first集中是否有空(T)*/boo I HaveEmpty(int nVn) (if (nVn nVt) return true;pt = pt-next;)return false;I/计算fol low集,例:U-xVy, U-xV.(注:初始符必含#-1)*/void Follow(int V) i nt i ;struct pRNode *pt ;if(100 = V) /当为初始符时/AddFollow(V, -1, 0 );for (i = 0; i rCursor != V) /注此不能处理:UxVyVz 的情况/ pt = pt-nex

24、t;if (NULL != pt)(pt = pt-next; /*V 右侧的符号/if (NULL = pt) /*当V后为空时VxV,将左符的fol low集并入V的fol low集中/ (if (NULL = followPi. ICursor - 100 & Pi. ICursor != V) (Follow(Pi. ICursor);AddFoI Iow(V, Pi. ICursor, 0);)else /不为空时VxVy,(注意:y- 调用AddFol low加入Vt或y的f i rst集/ (while (NULL != pt & HaveEmpty(pt-rCursor)Add

25、Fol low(V, pt-rCursor, 1) : /*y 的前缀中有空时,加如 first 集/ pt = pt-next;if (NULL = pt) /当后面的字符可以推出空时/(if(NULL = followPi. ICursor - 100 & Pi, ICursor != V) (Follow(Pi.ICursor);)AddFoI Iow(V, Pi. ICursor, 0);else /发现不为空的字符时/(AddFollow(V, pt-rCursor, 1);)/当数值小于100时nCh为Vt*/*#用T表示,kind用于区分是并入符号的f i rst集,还是fol

26、low集kind = 表加入 fol low 集,k i nd = 1 加入 first 集/void AddFollow(int V, int nCh, int kind) (struct co I I ectNode *pt, *qt;int ch; /用于处理Vn*/pt = NULL;qt = NULL;if(nCh nVt = nCh) break;e I se(qt = pt;pt = pt-next;Ii f(NULL = pt)pt = (struct col I ectNode *)ma 11oc(s i zeof(struct col I ectNode);pt-nVt =

27、 nCh;pt-next = NULL;if (NULL = followV - 100)(followV - 100 = pt;e I seIqt-next = pt; /*qt指向fol low集的最后个元素/ pt = ptnext;)else /为非终结符时,要区分是加f i rst还是fol low*/Iif(0 = kind)(pt = follownCh - 100:whiIe(NULL != pt)(ch = pt-nVt;AddFollow(V, ch, 0);pt = pt-next;)e I se(pt = firstnCh - 100;whiIe(NULL != pt)

28、(ch = pt-nVt;if(-1 != ch)(AddFoI Iow(V, ch, 1);)pt = pt-next;)/输出 f i rst 或 fol low 集/void ShowCo11ect(struct col I ectNode *coI Iect) struct col I ectNode *pt; i = 0;while(NULL != collecti) (pt = co I Iect i;printf(n%c:t, Vni);whiIe(NULL != pt) (i f(-1 != pt-nVt)printf (紀”,Vtpt-nVt);) e I seprintf(

29、 #);pt = pt-next;)i+;printf (n);)/计算 f i rst 和 f0 11 ow*/void FirstFol low() (i nt i; i = 0; whi leC 0 != Vni) (if(NULL = firsti) First(100 + i);i+;i = 0;whi leC 0 != Vni) (i f(NULL = followi) Fol low(100 + i);i+;/*= 构造预测分析表,例:U:xyz*/void CreateAT() (int i;struct pRNode *pt;struct col I ectNode *ct;for(i = 0; i rCursor)(/处理非终结符,当为终结符时,定含空为假跳出/ct = firstpt-rCursor - 100;whiIe (NULL != ct)if(-1 != ct-nVt)analyseTablePi, (Cursor - 100ct-nVt = i;ct = ct-next;pt = pt-next;)if (NU

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁