




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、武汉理工大学编译原理课程设计二-十进制的语法分析及语义分析程序设计-算符优先分析法1.系统描述11目的通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。12算符优先分析方法原理:算符优先分析方法是根据算符之间的优先关系而设计的一种自下而上的分析方法。算符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。算符优先分析过程是自下而上的归约过程,所谓的算符优先分析就是定义算符之间(确切地说,终结符之间)的某种优先关系,借助于这种优先关系寻找“可归约串”和进行归约。该文法必须满足以下条
2、件:文法它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下产生式右部:QR;首先求出该文法的优先关系表,在程序中用2维数组表示,-1表示小于或者等于,大于为1,其它为0表示错误。在输入一串字符串以后进行按照文法一步一步的进行规约,我所进行的是直接规约到文法的符号而不是规约到N。数据结构使用的是链表,用一个STRUCT来表示一个元素,其中包含符号和下一个符号的指针。2翻译方法概述2.1语法分析采用递归下降方法,为对应文法中的每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串。若输入串是给定文法的句子,则从文法的开始符号出发一定能推导出与输入的单词串完全相同的句子
3、。语法分析是编译过程的一个逻辑阶段。语法分析的任务是在的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等。语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC等工具自动生成。语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。语法分析的主要工作:是识别由词法分析给出的单词序列是否是给定的正确句子(程序)。语法分析常用的方法:自顶向下的语法分析和自底向上的语法分析两大类。此次设计中语法分析中主要通过递归下降分析法对语法分析处理过程进行控制,使输出的三地址表示的翻译
4、的工作有条不紊的进行,同时识别语法分析中的语法错误。递归下降法主要采用自顶向下方法,即从文法的开始符号开始进行分析,逐渐推导的往下构造语法树,使其树叶正好构造出所给定的源程序串。自顶向下方法的关键是确定在推导过程中选择候选式的问题。当进行推导时,一个非终结符可能对应多个产生式,这样我们就无法事先知道应该用哪个产生式,因此实用都作了一些限制。以便在任何情况下都能确定应该用的产生式。自顶向下的主要思想是从开始符出发导出句型并一个符号一个符号地与给定终结符串进行匹配。如果全部匹配成功,则表示开始符号可推导出给定的终结符串。因此判定给定终结符号串是正确句子。在语法分析的同时可由语法分析程序调用相应的语
5、义子程序进行语义处理,完成附加在所使用的产生式上的语义规则描述,并生成四元式的中间代码形式。2.2语义分析语义分析是编译过程的一个逻辑阶段, 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。如有的编译程序要对实数用作数组下标的情况报告错误。又比如某些某些程序规定运算对象可被强制,那么当二目运算施于一整型和一实型对象时,编译程序应将整型转换为实型而不能认为是源程序的错误。2.3中间代码生
6、成中间代码,也称中间语言,是复杂性介于源程序语言和机器语言的一种表示形式。为了使编译程序有较高的目标程序质量,或要求从编译程序逻辑结构上把与机器无关和与机器有关的工作明显的分开来时,许多编译程序都采用了某种复杂性介于源程序语言和机器语言之间的中间语言。中间代码(语言)是一种特殊结构的语言,编译程序所使用的中间代码有多种形式。按其结构分常见的有逆波兰式(后缀式)、三地址代码(三元式、四元式)和树形表示(抽象语法树)、DAG表示。2.4属性文法对于文法的每个产生式都配备了一组属性的计算规则,称为语义规则。所谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作,从而实现语义处理。 一个
7、属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在文法的每个产生式上。本系统中所使用FOR循环语句的文法包括FOR语句本身,赋值表达式和布尔表达式。3.算法描述首先建立一个符号栈S,既用它寄存终结符,也用它寄存非终结符。以下给出分析算法,其中k代表符号栈S的深度。k:=1; Sk:=#;REPEAT把下一个输入符号读进a中; IF Sk属于firstVT THEN j:= k ELSE j:=k-1; WHILE Sj>a DO BEGIN REPEAT Q:=Sj; IF Sj-1 属于firstVT THEN j:=j-1 ELSE j:=j-2 UNTIL Sj<
8、;Q; 把Sj+1Sk归约为某个N; K:=j+1; Sk:=N END OF WHILE; IF Sj <a OR Sj=a THEN BEGIN k:=k+1; Sk:=a END ELSE ERROR /出错UNTIL a=#在这个程序的设计中主要先显示语法分析所需要通道的文法,然后再进行词法分析,词法分析成功后再进行语义分析并生成中间代码,否则就提示语义分析出错并不进行语义分析生成中间代码。4文法及属性文法的描述对于文法的每个产生式都配备了一组属性的计算规则,称为语义规则。所谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作,从而实现语义处理。 一个属性文法包含一
9、个上下文无关文法和一系列语义规则,这些语义规则附在文法的每个产生式上。形式上讲,属性文法是一个三元组 :A=(G,V,F), 其中:G:是一个上下文无关文法;V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连,这些属性代表与文法符号相关信息;F:关于属性的属性断言或一组属性的计算规则(称为语义规则) 。 断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。5. 系统的详细设计5.1 文法设计在程序的主界面中首先列出在词法分析中需要用到的几个文法:直接输入根据已知文法构造的算符优先关系矩阵。输入已知文法的FIRSTVT和LASTVT集合,由程序自动生成该
10、文法的算符优先关系矩阵。S A.A|AA 0AA 1AA 0A 1确定文法的机内表示形式;确定优先关系矩阵的存放方式。5.2程序流程图设计 开始 输入一个待判断文法 进行词法分析分析成功 N 进行归约分析 Y 打印归约结果 结束5.3 用例分析(1)运行结果:(2)归约成功的图: (3)归约失败的图6.心得体会通过对二-十进制语法分析及语义分析的程序设计(算符优先发),让我加深对语法及语义分析原理的理解,在设计过程中虽然遇到了很多的困难,从一开始设计二进制的文法开始,再到后来设计语法分析程序,都有很多考虑不周的情况。在编程过程中,我还参考了同学的程序,查阅了很多资料,上网查找了有关材料,才写出
11、了的,所以,这次课程设计也不是那么简单,总的来说,通过此次课程设计,学会了很多东西。7. 参考文献1张素琴、吕映芝、蒋维杜、戴桂兰等编译原理(第2版)清华大学出版社2005年2月2编译原理主 编:张幸儿.科学出版社 .1999年4月3 程序设计语言编译原理(第3版).陈火旺、刘春林等.国防工业出版社.2003年4 编译原理与技术(第二版)主编:陈意云 .中国科学技术大学出版社.2002年1月8. 源程序清单16/*/* 算符优先分析程序 */*/#include <stdio.h>#include <tchar.h>#include <iostream>#i
12、nclude<math.h>#include "malloc.h"void push(char pchar);/入栈函数 char pop(void);/出栈函数 int CharToInt(char ch);/将字符转为数字,以得到算符优先值void GoBreakTo();/归约void dosome(void);/开始识别double getValue();/转化为十进制/存储算符优先关系表,大于为1,小于或等于为-1,其它为0表示出错const int table44 = 0, -1, -1, 1 , 1, -1, -1, 1 , 1, -1, -1,
13、1 , -1, -1, -1, -1, ;void display()char sign4 = '.', '0', '1', '#' ;printf("文法如下:n");printf("S A.A|AnA 0AnA 1AnA 0nA 1n");printf("*n");printf(" | . | 0 | 1 | # |n");printf("*n");for (int i = 0; i < 4; i+)printf(&quo
14、t;%c", signi);for (int j = 0; j < 4; j+)if (tableij = 1)printf("| >t");else if (tableij = -1)printf("| <t");else printf("| nullt");printf("|n");printf("*n");printf("请输入二进制字符串,以'#'结束n");printf("例如:10.01#n");in
15、t right; /设置开关项,当出错时为0struct Lcharchar char_ch;struct Lchar *next;LLchar, *p, *h, *temp, *top, *base;void main(void)char ch;right = 1;display();/初始化栈顶栈底base = (Lchar*)malloc(sizeof(LLchar);base->next = NULL;base->char_ch = '#'top = base;h = (Lchar*)malloc(sizeof(LLchar);h->next = NU
16、LL;p = h;do /输入待比较字符串,以'#'结束ch = getchar();putchar(ch);if (ch = '.' |ch = '0' |ch = '1' | ch = '#')temp = (Lchar*)malloc(sizeof(LLchar);temp->char_ch = ch;temp->next = NULL;p->next = temp;/尾插法建立字符串链表p = temp;elseprintf("n字符串输入错误,请重新输入字符串:n")
17、;system("pause");return; while (ch != '#'); /输入待比较字符串,以'#'结束dosome(); /开始识别if (right)printf("n%f", getValue();printf("n归约成功!n");elseprintf("n归约失败!n");system("pause");int size_of_array(char a)int i = 0, count = 0;while (ai != '#
18、9;)count+;i+;return count;double getValue()char num30;int n=0,dot,length;/dot记录小数点的位置double value=0;p = h->next;while (p != NULL)numn = p->char_ch;n+;p = p->next;length = size_of_array(num);n = 0;while (numn != '.'&&numn!='#')n+;dot = n;if (dot < length)for (n = 0
19、; n < dot; n+)value = value + pow(2, dot - n - 1)*(numn - 48);for (n = dot + 1; n < length; n+)value = value + pow(2, dot - n)*(numn - 48);elsefor (n = 0; n < length; n+)value = value + pow(2, length - n - 1)*(numn - 48);return value;void push(char pchar)/入栈temp = (Lchar*)malloc(sizeof(LLch
20、ar);temp->char_ch = pchar;temp->next = top;top = temp;char pop(void)/出栈char c;c = top->char_ch;if (top->char_ch != '#')top = top->next;return c;int CharToInt(char ch) /将字符转为数字,以得到算符优先值int t;switch (ch)case '.':t = 0; break;case '0':t = 1; break;case '1'
21、:t = 2; break;case '#':t = 3;return t;void GoBreakTo()char top_char;char below_top1_char;char below_top2_char;top_char = pop();if (top_char = '0' | top_char = '1')push('A');if (top_char = 'A')below_top1_char = pop();if (below_top1_char = '0' | below_to
22、p1_char = '1')push('A');else if (below_top1_char = '#')push('S');else if (below_top1_char = '.')below_top2_char = pop();if (below_top2_char = 'A')push('S');elseright = 0;elseright = 0;void dosome(void)int i, j, step=0;char current_char; /当前符号ch
23、ar stack_char; /符号栈p = h->next;printf("n步骤t符号栈t剩余输入串t移进或归约t");while (1)current_char = p->char_ch;temp = top;if (temp->char_ch = 'S')break;while (temp->char_ch = 'A')temp = temp->next;stack_char = temp->char_ch;i = CharToInt(stack_char);j = CharToInt(current_char);printf("n%d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地下车位买卖合同-买卖合同3篇
- 甘肃造价咨询方案
- 2025年跨境电商综合物流服务协议
- 2025年版网络安全评估与技术服务合同
- 2025安全生产合同管理制度
- 2025年版事业单位专业劳务派遣合作协议版B版
- 物流公园咨询方案
- 纳税筹划方案咨询
- 模具加工合同范本3篇
- 中国邮政2025沈阳市秋招数据分析岗位面试模拟题及答案
- optimact540技术参考手册
- 周口市医疗保障门诊特定药品保险申请表
- 光伏电站组件清洗周边除草治理方案
- 建筑面积测绘报告范本
- 校园物业考评表
- 药品生产质量管理工程完整版课件
- 爆破作业人员培训考核题库
- 2019版外研社高中英语选择性必修三单词默写表
- 核质保监查员考试复习题(答案)
- 墙体喷射混凝土加固工程方案一
- 医学统计学SPSS
评论
0/150
提交评论