算符优先文法及语义分析程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算符优先文法及语义分析程序设计
1.设计目的
掌握算符优先文法进行语法分析,通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。进一步培养编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,综合使用程序设计语言、数据结构和编译原理的知识。
2.设计要求
用算符优先文法进行二---十进制的语法分析及语义分析程序设计,编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
3.设计方案
3.1算符优先分析方法原理:
算符优先分析方法是根据算符之间的优先关系而设计的一种自下而上的分析方法。算符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。算符优先分析过程是自下而上的归约过程,所谓的算符优先分析就是定义算符之间(确切地说,终结符之间)的某种优先关系,借助于这种优先关系寻找“可归约串”和进行归约。
该文法必须满足以下条件:
文法它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下产生式右部:…QR…;
首先求出该文法的优先关系表,在程序中用2维数组表示,-1表示小于或者等于,大于为1,其它为0表示错误。
在输入一串字符串以后进行按照文法一步一步的进行规约,我所进行的是直接规约到文法的符号而不是规约到N。
数据结构使用的是链表,用一个STRUCT来表示一个元素,其中包含符号和下一个符号的指针。
3.2算法描述:
首先建立一个符号栈S,既用它寄存终结符,也用它寄存非终结符。以下给出分析算法,其中k代表符号栈S的深度。
k:=1; S[k]:=’#’;
REPEAT
把下一个输入符号读进a中;
IF S[k]属于firstVT THEN j:= k ELSE j:=k-1;
WHILE S[j]>a DO
BEGIN
REPEAT
Q:=S[j];
IF S[j-1] 属于firstVT THEN j:=j-1 ELSE j:=j-2