最新北方工业大学编译原理试验2报告语法分析_第1页
最新北方工业大学编译原理试验2报告语法分析_第2页
最新北方工业大学编译原理试验2报告语法分析_第3页
最新北方工业大学编译原理试验2报告语法分析_第4页
最新北方工业大学编译原理试验2报告语法分析_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品文档编译原理实验报告实验题目:语法分析器构造指导教师:杨健 姓名:杨先宇 班级:计 13-4 学号:实验成绩:精品文档精品文档实 验 题 目实验二 语法分析器构造实 验 目 的 和 要 求借助于词法分析程序提供的分析结果,编写一个算符优先语法分析程 序,程序能进行语法结构分析和错误检查,并产生相应的归约信息。同时 给出出错信息和错误类型,从而加深对语法分析的理解。说明提示:1. 本实验的优先表可以手工先设计好。2. 本实验要求中提出的“产出相应的归约信息”意指在语法分析的过程中,一旦产 生归约,在程序上产生并最终输出归约产生式序号。3. 出错类型的产生可预先对应优

2、先表中出错栏列表说明其出错类型,并分别编序,当分析中产生错误时以字符串输出相应表中错误信息。设 计 思 想 与 框 架功能描述: LL( 1)分析法是一种不带回溯的非递归的自上而下的分析 法. 其基本思想是 根据输入串的当前输入符号来唯一确定选用某条规则来 进行推倒 , 当这个输入符号与推倒的第一个符号相同时再取输入串的下一 个符号,继续确定下一个推倒应选的规则 ,如此下去 ,直到推倒出被分析的 输入串为止 .1. 首先,手工制作一个算符优先表(也可以编程序实现) 。2. 将词法分析所得到的预处理文件作为该程序的输入文件,并根据相应的 算法提取出算术表达式并转换为输入串,将其保存在 strin

3、gs 这个字符数 组中,并把表达式中相应常量用字符 i 来表示,以便规约(以 #结束输 入串)。3.其次,初始化符号栈。将输入串里的字符读进 a里(a 用于表示当前的 输入字符),将栈顶元素与 a(当前字符 )相比较,如果栈顶元素的优先级比 a 的低或等于则进栈; 如果栈顶元素的优先级比 a 的高则将栈顶指针下移,精品文档精品文档直到找到一个字符串的优先级比它上一个字符串的优先级低的字符串(该 过程为寻找最左素短语) ,然后将这两个字符中间的符号串寻找匹配的产生 式后进行规约,并将其弹出站定,将规约得到的非终结符入栈;栈顶元素 的下一个元素优先级低于或等于当前输入的字符串就移进,否则就出错。

4、然后重复 c 过程,直到输入串结束 (遇见 #)。(输出相应的移近规约过 程)。4.重复 b和c过程,直到该预处理文件结束(遇见 #)。核 心 算 法void process(char *temp)int k = 1, j, w, l, m, t = 0, p, q, v, yu = 0; stack0 = ;stackk = #; dangqianfuhao = ;panduanshengyuzifuchuan(yu);step = 0;shuchu(0, -1);/ 这是对 #号的处理/-1 代表char Q;int i = 0;dodangqianfuhao = tempi; / 取符号

5、精品文档精品文档int flag = 0;/对终结符号的善意假设for (w = 0; w 8; w+) 匹配if (stackk = wordw) flag = 1;/ 查找运算符表, 谁与 stackkif (flag = 1)j = k; else/ j指向终极符了j = k - 1;/ j指向 stack 中最后一个非终结符for (w = 0; w )doQ = stackj;精品文档精品文档int flag = 0;/ 再次做出善意假设终结符for (w = 0; w 8; w+)if (stackj - 1 = wordw) flag = 1;if (flag = 1) j =

6、j - 1;elsej = j - 2;for (w = 0; w 8; w+)/ 找出 sj 和 Q 对应优先表里的位置,对决if (stackj = wordw) p = w;if (Q = wordw)q = w;/ p 记录员,代理人/ q 记录员,代理人 while (Mpq != );/ 当然所有前提是, 可行的情况下,但是为了做出最初的判断,使用了 do-whilestackj + 1 = N; 替/ N 的诞生,非终结符代精品文档/ 符号栈出栈,向前走/ 以绝后患,置 0/ 规约之/ 剩下的事情就是根据 M 判精品文档for (w = j + 2; w = k; w+) 步,找

7、到另一个非终结符stackw = 0;k = j + 1;shuchu(1,1);break;if(Mlm=)断,规约之k = k + 1;stackk = dangqianfuhao;yu+;panduanshengyuzifuchuan(yu);shuchu(0, -1);i+;else if(Mlm=)k=k+1;stackk=dangqianfuhao;yu+;panduanshengyuzifuchuan(yu);shuchu(0, 0); i+;精品文档精品文档 elseif(Mlm=e1)printf( 非法左括号 !n); i+;else if(Mlm=e2)printf( 缺

8、少运算符 !n); i+;else if(Mlm=e3)printf( 非法右括号 !n); i+;while(tempi!=0);源 程 序 及 注#include#include#include char word8=+,-,*,/,(,),i,#;char *xingshi6=N+N,N-N,N*N,N/N,)N(,i;精品文档精品文档char M88=, , , , ,=,e2,e2, ,e2,e2, ,e3,=printf(%-10d, step); printf(%-10s, stack);if (m = -1) printf();printf(%10c, dangqianfuha

9、o);printf(%10s, shengyushuruchuan);if (t = 0) printf(移进 n);if (t = 1) printf(规约 n);step+;void panduanshengyuzifuchuan(int a) / 判断剩余字符串 int t,v;for (t = 0; t strlen(aftertemp); t+) shengyushuruchuant = 0;for (t = 0, v = a; v strlen(aftertemp); t+, v+) shengyushuruchuant = aftertempv;void process(char

10、 *temp)int k = 1, j, w, l, m, t = 0, p, q, v, yu = 0; stack0 = ; stackk = #;dangqianfuhao = ; panduanshengyuzifuchuan(yu);step = 0; shuchu(0, -1);/ 这是对 #号的处理/-1 代表精品文档精品文档char Q; int i = 0; dodangqianfuhao = tempi; int flag = 0;for (w = 0; w 8; w+)/取符号对终结符号的善意假设/ 查找运算符表, 谁与 stackk匹配if (stackk = word

11、w) flag = 1;if (flag = 1)j = k; else/ j指向终极符了j = k - 1;/ j指向 stack 中最后一个非终结符for (w = 0; w )/终结符的处理 do精品文档精品文档Q = stackj; int flag = 0;/ 再次做出善意假设终结符for (w = 0; w 8; w+)if (stackj - 1 = wordw)flag = 1;if (flag = 1)j = j - 1;elsej = j - 2;for (w = 0; w 8; w+)先表里的位置,对决if (stackj = wordw) p = w;if (Q = w

12、ordw)q = w; while (Mpq != );/ 找出 sj 和 Q 对应优/ p 记录员,代理人/ q 记录员,代理人/ 当然所有前提是, 可行的情况下,但是为了做出最初的判断,使用了 do-whilestackj + 1 = N;替for (w = j + 2; w = k; w+) 步,找到另一个非终结符stackw = 0;/ N 的诞生,非终结符代/ 符号栈出栈,向前走一/ 以绝后患,置 0精品文档精品文档k = j + 1;shuchu(1,1); / 规约之break;if(Mlm= | str = | str = ! | str = =) & ch = =)ch =

13、fgetc(fp);int k = 0;if(ch=#)printf( 语法分析结束! n); fclose(fp); return 0;ch = fgetc(fp);while (ch != & ch != #)tempk+ = ch;ch = fgetc(fp);tempk = 0;printf( 要处理的表达式为 %sn, temp);int t = 0;/ 现在开始处理int y = 0;while(tempt!=0)该串精品文档精品文档int flag = 0; / 做出善意推断,非终结符while (isdigit(tempt) != 0)t+;flag = 1; / 数字是终结符

14、if (flag = 1)aftertempy = i;/ tempa 为终结符料理后事,既提取类型y+;if (flag = 0)aftertempy = tempt;/ 提取类型y+;t+;aftertempy = #;aftertempy + 1 = 0;/ 结束本串精品文档精品文档printf( 表达式转化为输入串为 %sn, aftertemp);printf( 步骤号 符号栈 优先关系 当前分析符 剩余输入串 动作n);for (int w = 1; w 10; w+)/ 初始化栈stackw = 0;process(aftertemp);fclose(fp);printf(END !n); retur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论