赋值语句的解释程序设计.pdf

上传人:PIYPING 文档编号:11336920 上传时间:2021-07-27 格式:PDF 页数:17 大小:782.32KB
返回 下载 相关 举报
赋值语句的解释程序设计.pdf_第1页
第1页 / 共17页
赋值语句的解释程序设计.pdf_第2页
第2页 / 共17页
赋值语句的解释程序设计.pdf_第3页
第3页 / 共17页
赋值语句的解释程序设计.pdf_第4页
第4页 / 共17页
赋值语句的解释程序设计.pdf_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《赋值语句的解释程序设计.pdf》由会员分享,可在线阅读,更多相关《赋值语句的解释程序设计.pdf(17页珍藏版)》请在三一文库上搜索。

1、编译原理课程设计报告二编译原理课程设计报告二 姓名:李姓名:李 敏敏 学号:学号:2013201720132017 专业:计算机科学与技术专业:计算机科学与技术 班级:班级:20132013 级二班级二班 西南交通大学信息科学与技术学院西南交通大学信息科学与技术学院 20152015 年年 6 6 月月 13 13 日日 (二)赋值语句的解释程序设计(二)赋值语句的解释程序设计 一、一、 设计题目设计题目 赋值语句的解释程序设计 二、设计目的二、设计目的 了解掌握算符优先分析的基本方法、内容以及基本程序实现;学会科学思 考并解决问题,提高程序设计能力。更进一步的去体会这种简单直观、广为 使用的

2、自下而上分析法。 三、设计环境:三、设计环境: VS2013,Windows 系统 四、需求分析:四、需求分析: 用算符优先分析方法设计一个分析解释程序,对输入的赋值语句、输出 语句、 清除语句进行词法分析、 语法分析、 表达式求值并存储于指定变量中; 若存在错误,提示错误相关信息。 文法表示: Sv=E|E?|clear EE+T|E-T|T TT*F|T/F|F F (E)|v|c 五、概要设计五、概要设计: (1)在设计的过程中,设计单词的种别码 单词符号种别码 =1 2? +3 -4 *5 /6 7( 8) v9 c10 clear11 #12 (2)设计优先关系表,归约栈 关系+-*

3、/()vc?clear# + - * / ( ) v c ? Clear # = = 六、详细设计:六、详细设计: / OperatorPrecedencePrase.cpp : 定义控制台应用程序的入口点。 / #include stdafx.h #include stdafx.h #include iostream #include fstream #include sstream #include string #include iomanip using namespace std; void InputCheck(string int i; /判断输入的表达式是否规范 int fla

4、g = 1; for (i = 0; i len; i+) if (chlen - 1 != ) cout 所输入表达式不规范! endl; else int r; int r1; int k; char q; char a; char first1010; int fflag10 = 0 ; char last1010; int lflag10 = 0 ; char st2020; char data2020; char s100; char lable20; char s12010; int zhongjiefu(char c) int xiabiao(char c)/求字符c在算符优先关

5、系表中的下标 int i; for (i = 0; lablei != 0; i+) return 0; if (c = lablei) return 1; /判断字符c是否是终结符 void firstvt(char c)/求FIRSTVT集 int i, j, k, m, n; for (i = 0; ir; i+) if (fflagi = 0) n = firsti0 + 1; m = 0; do if (m = 2 | stim = |) if (zhongjiefu(stim + 1) else if (zhongjiefu(stim + 2) if (stim + 1 != c)

6、 firstvt(stim + 1); for (j = 0; jr; j+) if (stj0 = stim + 1) firstin = stim + 2; n+; firstin = stim + 1; n+; if (sti0 = c) break; int i; for (i = 0; lablei != 0; i+) return -1; if (c = lablei) return i; break; for (k = 0; kfirstj0; k+) int t; for (t = 0; tn; t+) if (t = n) firstin = firstjk + 1; n+;

7、 if (firstit = firstjk + 1) break; m+; while (stim != 0); firstin = 0; firsti0 = -n; fflagi = 1; void lastvt(char c) /求LASTVT集 int i, j, k, m, n; for (i = 0; ir; i+) if (lflagi = 0) n = lasti0 + 1; m = 0; do if (stim + 1 = 0 | stim + 1 = |) if (zhongjiefu(stim) if (sti0 = c) break; else if (zhongjie

8、fu(stim - 1) if (stim != c) lastvt(stim); for (j = 0; jr; j+) for (k = 0; klastj0; k+) int t; for (t = 0; tn; t+) if (t = n) lastin = lastjk + 1; n+; if (lastit = lastjk + 1) break; if (stj0 = stim) break; lastin = stim - 1; n+; lastin = stim; n+; m+; while (stim != 0); lastin = 0; lasti0 = -n; lfla

9、gi = 1; void PreTable() char text2010; char s12010; int i, j, k, t, l, x = 0, y = 0; int m, n; x = 0; for (i = 0; ir; i+) firstvt(sti0); lastvt(sti0); for (i = 0; i; else textxy = stij; y+; textxy = 0; x+; y = 0; r1 = x; /*输出转化后的文法规则串*/ printf(转化后的文法为:n); for (i = 0; ix; i+) printf(%sn, texti); for

10、(i = 0; ix; i+) for (i = 0; ix; i+) for (j = 1; textij + 1 != 0; j+) if (zhongjiefu(textij) kr; k+) if (stk0 = textij) break; for (k = 0; kr; k+) m = xiabiao(textij); for (t = 0; tfirstk0; t+) n = xiabiao(firstkt + 1); datamn = ; if (stk0 = textij + 1) break; m = xiabiao(textij); n = xiabiao(textij

11、+ 2); datamn = =; m = xiabiao(textij); n = xiabiao(textij + 1); datamn = =; s1i0 = texti0; for (j = 3, l = 1; textij != 0; j+, l+) s1il = textij; s1il = 0; 2) for (t = 0; t; m = xiabiao(#); for (t = 0; tfirst00; t+) n = xiabiao(#); for (t = 0; t; n = xiabiao(first0t + 1); datamn = ; void output(int

12、j, int k, char *s) int deal(string input) char string2010; int i, j; int n = 0; int i; for (i = j; i = k; i+) for (; n) do while (dataxy != ); int m, n, N; for (m = j + 1; m = k; m+) for (N = 0; Nr1; N+) for (n = 1; stringNn != 0; n+) if (!zhongjiefu(sm) break; if (zhongjiefu(sj - 1) j = j - 1; else

13、 j = j - 2; x = xiabiao(sj); y = xiabiao(q); if (sm = stringNn) sj + 1 = stringN0; break; k = j + 1; if (k = 2 return 1; else if (dataxy = | dataxy = =) else printf(n输入串不符合文法的定义!n); return 0; k+; sk = a; i+; return 0; void yufaAnalyzer(string input) int i,j; char last1010; char first1010; /语法分析优先关系

14、cout r; cout endl; cout 语法产生式如下: endl; for (int i = 0; i sti; firsti0 = 0; lasti0 = 0; for (i = 0; ir; i+) lablek = #; lablek + 1 = 0; PreTable(); printf(算符优先分析表如下:n); for (i = 0; lablei != 0; i+) printf(t%c, lablei); printf(n); for (i = 0; ik + 1; i+) printf(%ct, lablei); for (j = 0; jk + 1; j+) pr

15、intf(n); printf(%ct, dataij); for (j = 0; stij != 0; j+) if (stijZ) int i, j; string str; for (i = 0; i len1; i+) /*判断运算符*/ /词法分析 if (chi = + | chi = - | chi = = | chi = * | chi = /) switch (chi) case +:cout 3 setw(10) + endl; break; case -:cout 4 setw(10) - endl; break; case *:cout 5 setw(10) * end

16、l; break; case /:cout 6 setw(10) / endl; break; case =:cout 1 setw(10) = endl; break; default:cout 01: setw(10) chi endl; break; /*判断界符*/ else if (chi = , | chi = ( | chi = ) | chi = = A cout 10 setw(10) chi = 0 for (j = i + 1; j = A break; switch (chi) case(:cout 7 setw(10) ( endl; break; case):cou

17、t 8 setw(10) ) endl; break; case?:cout 2 setw(10) ? endl; break; case#:cout 12 setw(10) # endl; break; default:cout 02: setw(10) chi | chi = | chi = . | chi = 12 | chi = ? | chi = #) 0 int | str = float | str = char str = switch | str = case cout 11 setw(10) clear endl; cout 03: setw(10) str endl; e

18、lse void main() string input; yufaAnalyzer(input); int wl = 1; while (wl) system(pause); cout Input the content that need to analyzer(end with #): input; cout 词法分析如下: endl 种别码 setw(7) 单词 endl; GraAnalyzer(input); InputCheck(input); cout wl; /语法分析语句的正确性 cout endl 退出请按0,继续请按1! endl; /词法分析 /判断输入语句是否符合表达式规范 /语法分析其优先顺序 七、结果测试:七、结果测试: 八、心得与体会:八、心得与体会: 通过这一次的课程设计,自己将老师上课时所讲授的理论知识与实际程序 实现结合了起来, 对与算符优先分析法相关的知识有了更进一步的认识。对于可 能会出现的错误也有了一些基本的认识。学习并掌握了算符优先分析法的应用, 进一步加深理解了语法的判断,优先关系的判断上面有了进一步的掌握。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1