版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理程序设计实验报告语法分析器的构造 实验题目班级:计算机1306姓名:韩远磊 学号:20133948实验目标:实现一个能够完成语法分析任务的语法分析器,按照源语言的语法规则,从词法分析的结果中识别出相应的语法范畴,同时进行语法检查。 给定文法G和字符串R( R VT*),检查、判定 R L(G)?即检查、判定R是否是文法G所能产生的合法的句子,同时报告和处理语法错误。实验内容:语法分析器设计文法:G(E): E -> T | E1T T -> F | T2F F -> i | (E)其中:1(+,-),2(*,/),i(变量或常数)(1)递归子程序是根据文法各产生式的首
2、符号与当前所读单词进行匹配,以决定候选产生式的;这就要求文法: 具有相同左部的各产生式,首符号不同; 文法不能有左递归! 消除左递归后的文法1:流程图:主程序子程序E子程序T子程序F (2) LL(1)分析法是指从左到右扫描、最左推导(LL)和只查看一个当前符号(括号中的 1)之意; LL(1)分析法又称预测分析法,与递归子程序法同属于自顶向下确定性语法分析方法; LL(1) 分析法的基本要点有三: 利用一个分析表,登记如何选择产生式的知识; 利用一个分析栈,记录分析过程; 此分析法要求文法必须是 LL(1)文法。 此文法含左递归,不是LL(1)文法;经文法变换(消除左递归)后可得:G(E)
3、的选择集合:构造LL(1)分析表: LL(1)分析法控制程序:源程序代码:(1)递归子程序#include <stdio.h>#include <stdlib.h> #include <string.h>void E();void T();void F();void E1();void T1();void read();void error();char m100;int i=0;int main()printf("请输入表达式: ");gets(m);E();if(mi!='#') error();else printf
4、("表达式正确!");return 0;void read() i=i+1;void error()printf("表达式错误!");void E()T();E1();void E1()if(mi='+' | mi='-') read(); T(); E1(); void T()F();T1();void T1()if(mi='*' | mi='/')read();F();T1();void F()if(mi='(')read();E();if(mi!=')'
5、)error();else if(mi!='i')error();read();(2)LL1#include <malloc.h>#include <stdio.h>#include <stdlib.h>#define STACKSIZE 50#define STACKINCREMENT 10typedef char SElemType;typedef int Status;typedef struct SElemType *base;SElemType *top;intstacksize;SqStack;Status InitStack(S
6、qStack &S)/初始化S.base = (SElemType * )malloc(STACKSIZE * sizeof(SElemType);if (!S.base)exit (-1);S.top=S.base;S.stacksize=STACKSIZE;return 1;Status Push(SqStack &S, SElemType e)/压栈if (S.top - S.base >= S.stacksize)/判断栈是否满啦S.base = (SElemType * )realloc(S.base, (S.stacksize + STACKINCREMENT
7、) * sizeof(SElemType);if (!S.base)exit(-1);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;(S.top)+;*(S.top) = e;return 1;Status Pop(SqStack &S, SElemType &e)/弹栈if (S.top = S.base)/判断栈是否为空return 0;e = *(S.top);S.top-;return 1;Status GrammerAnalysis(SqStack &S, char *ch, char c
8、) /分析函数char e;Push(S, '#');/先把#号压与栈Push(S, 'E');while (!(*(S.top) = '#') && (c = '#')Pop(S, e);if (e = 'E') && (c >= '0') && (c <= '9') | (c = '(')|(c>='A')&&(c<='Z')|(c>=
9、39;a')&&(c<='z')|c='.')Push(S , 'A');Push(S , 'T');else if (e = 'A')&&(c = '+')|(c = '-')Push(S , 'A');Push(S , 'T');ch+;c = *ch;else if (e = 'A') && (c = ')')|(c = '#');els
10、e if (e = 'T') && (c >= '0') && (c <= '9') | (c = '(')|(c>='A')&&(c<='Z')|(c>='a')&&(c<='z')|c='.')Push(S , 'B');Push(S , 'F');else if (e = 'B') &&
11、; (c = '*')|(c='/')Push(S , 'B');Push(S , 'F');ch+;c = *ch;else if (e = 'B') && (c = '+')|(c = ')')|(c = '#')|(c = '-');else if (e = 'F') && (c >= '0') && (c <= '9')|(c>=&
12、#39;A')&&(c<='Z')|(c>='a')&&(c<='z')|c='.')ch+;while (c = *ch) >= '0') && (c <= '9')|(c>='A')&&(c<='Z')|(c>='a')&&(c<='z')|c='.')ch+;else if (e = 'F') && (c = '(')Push(S, ')');Push(S, 'E');ch+;c = *ch;else if (e = ')') && (c = ')')ch+;c = *ch;else return 0;return 1;int main()char str50; char c;SqStack S;InitStack(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅游行业景区安全总监的面试要点和技巧
- 基于区块链技术的空天旅游载具安全监管方案研究
- 旅游行业部门经理面试要点提示
- 客户服务管理职位的招聘与选拔标准分析
- 旅游行业导游员专业面试指南
- 快递物流项目经理面试技巧介绍
- 2026宁夏银川永宁县卫生健康系统专业技术人员自主招聘59人备考题库附完整答案详解【全优】
- 2026上半年江西省江咨设计总院有限公司自主招聘4人备考题库及完整答案详解(典优)
- 2026年化工区块链技术应用创新报告
- 2026浙江宁波市医疗中心医院招聘编外人员1人备考题库及参考答案详解(突破训练)
- 螺蛳粉行业技术环境分析报告
- 实物期权理论视角下汽车产业并购的价值评估与策略优化研究
- 2024北师大版七年级生物上册期末复习全册必背知识清单
- (新教材)2026年人教版一年级下册数学 第二单元 20以内的退位减法 整 理和复习 课件
- 新型能源体系建设形势和展望-
- 2025年公务员多省联考《申论》(云南县乡卷)题及参考答案(网友回忆版)
- (完整)24个专业105个病种中医临床路径
- 高职院校学生学业规划模板
- 机械制造技术题库含参考答案
- 中央空调故障应急预案
- (2025修订版)CAAC无人机理论考试题库资料及参考答案
评论
0/150
提交评论