编译原理语法分析实验_第1页
编译原理语法分析实验_第2页
编译原理语法分析实验_第3页
编译原理语法分析实验_第4页
编译原理语法分析实验_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论