北方工业大学编译原理实验2报告语法分析

上传人:m**** 文档编号:488331265 上传时间:2023-06-11 格式:DOCX 页数:17 大小:66.21KB
返回 下载 相关 举报
北方工业大学编译原理实验2报告语法分析_第1页
第1页 / 共17页
北方工业大学编译原理实验2报告语法分析_第2页
第2页 / 共17页
北方工业大学编译原理实验2报告语法分析_第3页
第3页 / 共17页
北方工业大学编译原理实验2报告语法分析_第4页
第4页 / 共17页
北方工业大学编译原理实验2报告语法分析_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《北方工业大学编译原理实验2报告语法分析》由会员分享,可在线阅读,更多相关《北方工业大学编译原理实验2报告语法分析(17页珍藏版)》请在金锄头文库上搜索。

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

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

3、。将输入串里的字符读进a里(a用于表示当前的输入字符),将栈顶元素与a(当前字符)相比较,如果栈顶元素的优先级比a的低或等于则进栈;如果栈顶元素的优先级比a的高则将栈顶指针下移,直到找到一个字符串的优先级比它上一个字符串的优先级低的字符串(该过程为寻找最左素短语),然后将这两个字符中间的符号串寻找匹配的产生式后进行规约,并将其弹出站定,将规约得到的非终结符入栈;栈顶元素的下一个元素优先级低于或等于当前输入的字符串就移进,否则就出错。然后重复c过程,直到输入串结束(遇见#)。(输出相应的移近规约过程)。4.重复b和c过程,直到该预处理文件结束(遇见#)。核心算法void process(char

4、 *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 = wordw)flag = 1;if (f

5、lag = 1)j = k;/ j指向终极符了elsej = 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 = j - 1;elsej = j - 2;for (w = 0; w 8; w+)/ 找出sj和Q对应优先表里的位置,对决if (stackj = wordw)p = w;/ p记录员,代理人if (Q = wordw)q = w;/ q记录员

6、,代理人 while (Mpq != );/ 当然所有前提是,可行的情况下,但是为了做出最初的判断,使用了do-whilestackj + 1 = N;/ N的诞生,非终结符代替for (w = j + 2; w = k; w+)/ 符号栈出栈,向前走一步,找到另一个非终结符stackw = 0;/ 以绝后患,置0k = j + 1;shuchu(1,1);/ 规约之break;if(Mlm=)/ 剩下的事情就是根据M判断,规约之k = k + 1;stackk = dangqianfuhao;yu+;panduanshengyuzifuchuan(yu);shuchu(0, -1);i+;e

7、lse 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(缺少运算符!n);i+;else if(Mlm=e3)printf(非法右括号!n);i+;while(tempi!=0);源程序及注释#include#include#includechar word8=+,-,*,/,(,),i,#;char *xingshi6=N+N,N-N,N*N,N/N,)N(,i;ch

8、ar M88=,=,e2,e2,e2,e2,e3,=printf(%-10d, step);printf(%-10s, stack);if (m = -1)printf();printf(%10c, dangqianfuhao);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+)shengyushuruch

9、uant = 0;for (t = 0, v = a; v strlen(aftertemp); t+, v+)shengyushuruchuant = aftertempv;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;/ 取符号int flag = 0;/ 对终结符号的善意假设for (w = 0; w 8; w+)/ 查找运算符表,谁与stackk匹配if (stackk = wordw)flag = 1;if (flag = 1)j = k;/ j指向终极符了elsej = k - 1;/ j指向stack中最后一个非终结符for (w = 0; w 8; w+)/ 找出sj和当前字符在优先表里的位置if (stackj = wordw)l = w;/ l记录了当前字符的终结符类型if (dan

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

当前位置:首页 > 行业资料 > 国内外标准规范

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号