二十进制的语法分析及语义分析程序设计算符优先分析法讲述.docx
- 文档编号:26150633
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:24
- 大小:132.74KB
二十进制的语法分析及语义分析程序设计算符优先分析法讲述.docx
《二十进制的语法分析及语义分析程序设计算符优先分析法讲述.docx》由会员分享,可在线阅读,更多相关《二十进制的语法分析及语义分析程序设计算符优先分析法讲述.docx(24页珍藏版)》请在冰豆网上搜索。
二十进制的语法分析及语义分析程序设计算符优先分析法讲述
Ni学号:
0121210680***
课程设计
题目
二---十进制的语法分析及语义分析程序设计(算符优先分析法)
学院
计算机科学与技术学院
专业
软件工程
班级
软件sy1201班
姓名
***
指导教师
饶文碧
2015
年
1
月
14
日
课程设计任务书
学生姓名:
***专业班级:
软件sy1201班
指导教师:
饶文碧工作单位:
计算机科学与技术学院
题目:
二-十进制的语法分析及语义分析程序的设计
1.目的
通过设计、编制、调试一个语**法及语义分析程序,加深对语法及语义分析原理的理解。
2.设计内容及要求
设计一个二-十进制的语法分析及语义分析程序。
(1)选择算符优先分析法完成以上任务。
(2)写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。
(3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
3.课程设计进度安排
序号
阶段内容
所需用时间
1
给出语法分析方法及中间代码形式的描述、文法和属性文法的设计;或者词法分析方法及符号表和TOKEN代码的设计。
1天
2
简要的分析与概要设计、算法设计与程序设计
3天
3
撰写课程设计报告书
1天
合计
5天
目录
目录2
1.系统描述3
1.2设计内容及步骤4
2.翻译方法概述4
2.1词法分析4
2.2语法分析5
2.3中间代码生成5
2.4属性文法5
3.算符优先分析法6
4.文法7
4.1文法形式7
4.2文法分类7
4.3类型说明7
5.系统的详细设计8
5.1文法设计8
5.2构造算符优先关系矩阵9
5.3算法设计9
5.4运行结果14
6.总结及体会15
7.源代码16
二-十进制的语法分析及语义分析程序设计
----算符优先分析法
1.系统描述
通过设计、编制、调试一个二-十进制的语法分析及语义分析程序,加深对语法及语义分析原理的理解。
1.2设计内容及步骤
(1)设计算符优先文法:
G=(Vn,Vt,P,S)
(2)构造算符优先关系矩阵
(3)设计语法分析程序,对输入的数据进行语法分析
(4)将输入的合法二进制数转化为十进制数
2.翻译方法概述
2.1词法分析
词法分析是计算机科学中将字符序列转换为单词(Token)序列的过程。
进行语法分析的程序或者函数叫作词法分析器(Lexicalanalyzer,简称Lexer),也叫扫描器(Scanner)。
词法分析器一般以函数的形式存在,供语法分析器调用。
词法分析是编译过程中的第一个阶段,在语法分析前进行。
也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
简化设计、改进编译效率、增加编译系统的可移植性。
词法分析是编制一个读单词的过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
单词的分类主要分为五类:
1.关键字:
由程序语言定义的具有固定意义的标识符。
也称为保留字或基本字。
2.标识符:
用来表示程序中各种名字的字符串。
3.常数:
常数的类型一般有整型、实型、布尔型、文字型。
4.运算符:
如+、-、*、/等。
5.界限符:
如逗号、分号、括号等。
由于该程序不需进行词法分析,故在设计程序时省去了词法分析这一步骤。
2.2语法分析
语法分析是编译过程的一个逻辑阶段。
语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等。
语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述。
语法分析器(Parser)通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。
语法分析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入。
实际开发中,语法分析器可以手工编写,也可以使用工具(半)自动生成。
语法分析器的任务主要是确定是否可以以及如何从语法的起始符号推导出输入符号串(输入文本)。
2.3中间代码生成
中间代码,也称中间语言,是复杂性介于源程序语言和机器语言的一种表示形式。
为了使编译程序有较高的目标程序质量,或要求从编译程序逻辑结构上把与机器无关和与机器有关的工作明显的分开来时,许多编译程序都采用了某种复杂性介于源程序语言和机器语言之间的中间语言。
中间代码(语言)是一种特殊结构的语言,编译程序所使用的中间代码有多种形式。
按其结构分常见的有逆波兰式(后缀式)、三地址代码(三元式、四元式)和树形表示(抽象语法树)、DAG表示。
2.4属性文法
对于文法的每个产生式都配备了一组属性的计算规则,称为语义规则。
所谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作,从而实现语义处理。
一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在文法的每个产生式上。
3.算符优先分析法
算符文法:
即它的任一产生式的右部都不含两个相继的非终结符的文法。
如果G是一个不含空字符的算法文法,那么只要它的任一对终结符都之多只满足>,=,<的关系的其中一种,则称G是一个算符优先文法。
--的关系的一种,则称G是一个算符优先文法。
对于一个算符优先文法,只要能够造出它的算符优先表,就可以利用算符优先分析方法,分析一个句子是否符合这个文法的定义。
那么定义FirstVT(P)={a|P->a、、、或P->Qa、、、,a属于终结字符集,而Q属于非终结字符集}
LastVT(P)={a|P->...a或P->...aQ,a属于终结字符集,而Q属于非终结字符集}
由以下两条规则来构造FirstVT集:
(1)若有产生式P-〉a…、或P->Qa…,则a属于FirstVT(P);
(2)若有a属于FirstVT(Q),且有产生式P-〉Q…,则a属于FirstVT(P);
类似的有构造LastVT集的规则:
(1)若有产生式P->…a或P->…aQ,则a属于LastVT集。
(2)若a属于LastVT(Q),且有产生式P-〉…Q,则a属于LastVT集。
假定G是一个不含空字符产生式的算符文法。
对于任何一对终结符a,b,
(1)a=b,当且仅当G中含有形如P->…ab…或P->…aQb…的产生式;
(2)a…aR…的产生式,而R-〉b…或R->Qb…;
(3)a>b,当且仅当G中含有形如P->…Rb…的产生式,而R->…a或R->…aQ;
这样再结合上次的FirststVT和LastVT集的概念便可以由文法自动构造出算符优先表。
4.文法
4.1文法形式
在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。
文法的描述多用BNF(巴克斯范式),而另一个重要的概念:
正则表达式,也是文法的另一种形式。
4.2文法分类
自从乔姆斯基(Chomsky)于1956年建立形式语言的描述以来,形式语言的理论发展很快。
这种理论对计算机科学有着深刻的影响,特别是对程序设计语言的设计、编译方法和计算复杂性等方面更有重大的作用。
乔姆斯基把文法分成四种类型,即0型、1型、2型和3型。
这几类文法的差别在于对产生式施加不同的限制。
多数程序设计语言的单词的语法都能用正规文法或3型文法来描述。
3型文法G=(VN,VT,P,S)的P中的规则有两种形式:
一种是前面定义的形式,即:
A→aB或A→a其中A,B∈VN,a∈VT*,另一种形式是:
A→Ba或A→a,前者称为右线性文法,后者称为左线性文法。
正规文法所描述的是VT*上的正规集。
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。
称0型文法产生的语言为0型语言。
上下文有关文法、上下文无关文法和正规文法产生的语言分别称为上下文有关语言、上下文无关语言和正规语言。
4.3类型说明
设G=(VN,VT,P,S),如果它的每个产生式α→β是这样一种结构:
α∈(VN∪VT)*且至少含有一个非终结符,而β∈(VN∪VT)*,则G是一个0型文法。
0型文法也称短语文法。
一个非常重要的理论结果是,0型文法的能力相当于图灵机(Turing)。
或者说,任何0型语言都是递归可枚举的;反之,递归可枚举集必定是一个0型语言。
对0型文法产生式的形式作某些限制,以给出1,2和3型文法的定义。
设G=(VN,VT,P,S)为一文法,若P中的每一个产生式α→β均满足|β|≥|α|,仅仅S→ε除外,则文法G是1型或上下文有关的。
设G=(VN,VT,P,S),若P中的每一个产生式α→β满足:
α是一非终结符,β∈(VN∪VT)*则此文法称为2型的或上下文无关的。
有时将2型文法的产生式表示为形如:
A→β其中A∈VN,也就是说用β取代非终结符A时,与A所在的上下文无关,因此取名为上下文无关文法。
设G=(VN,VT,P,S),若P中的每一个产生式的形式都是A→aB或A→a,其中A和B都是非终结符,a是终结符,则G是3型文法或正规文法。
文法G定义为四元组(VN,VT,P,S)其中
VN:
非终结符号(或语法实体,或变量)集;
VT:
终结符号集;
P:
规则的集合;
VN,VT和P是非空有穷集。
S:
称作识别符号或开始符号的一个非终结符,它至少要在一条产生式中作为左部出现。
VN和VT不含公共的元素,即VN∩VT=φ
5.系统的详细设计
5.1文法设计
设计算符优先文法:
G=(Vn,Vt,P,S),其中Vn={S,A},Vt={.,0,1},P由下列产生式组成:
(1)S->A.A|A
(2)A->0A|1A
(3)A->0|1
5.2构造算符优先关系矩阵
.01#
.<<>
0><<>
1><<>
#<<<=
5.3算法设计
(1)设计语法分析程序:
定义两个向量myvector和wuhuivector,myvector用来存储剩余输入串,wuhuivector作为符号栈。
将myvector中栈顶元素即当前符号存于c中,比较符号栈最外面一个非终结符与当前符号的优先级,若该非终结符优先级后于或等价于当前符号,则移进当前符号至wuhuivector中,若该非终结符优先级先于当前符号,则找到符号栈中的最左素短语,并规约它,若规约成功,则继续分析,否则分析失败。
分析至符号栈中最外面的非终结符与当前符号均为‘#’时,分析成功。
a.将myvector栈顶元素存于c中,当动作为移进时,弹出栈顶元素:
if(s1=="移进")
{
c=myvector[myvector.size()-1];
myvector.pop_back();
}
b.比较符号栈最外面一个非终结符与当前符号的优先级,优先关系事先用table数组存储了:
while((j<4)&&(l==0))//找符号栈的最外面一个终结符
{
if(wuhuivector[k]==Vt[j])
l=1;
else
j++;
}
for(j=0;j<4;j++)
{
if(wuhuivector[k]==Vt[j])
m=j;
if(c==Vt[j])
n=j;
}
table[m][n]即为两者的优先级
table[4][4]={{-999,-1,-1,1},{1,-1,-1,1},{1,-1,-1,1},{-1,-1,-1,0}};
//-999表示无关系,1表示先于关系,0表示等价关系,-1表示后于关系
c.因无优先关系分析失败函数:
if(table[m][n]==-999)//失败
{
cout<<"分析失败!
"< ret=0; warn=0; break; } d.分析成功或移进函数: elseif(table[m][n]==0) { if(wuhuivector[k]=='#') { warn=0; s1="分析成功! "; } else { wuhuivector.push_back(c); s1="移进"; } } elseif(table[m][n]==-1)//移进 { wuhuivector.push_back(c); s1="移进"; } e.规约及因无匹配产生式分析失败函数: elseif(table[m][n]==1)//规约 { q=k; do{//找符号栈第二个终结符,寻找最左素短语 l=0; do{ p=0; q--; while((p<4)&&(l==0)) { if(wuhuivector[q]==Vt[p]) l=1; else p++; } }while(l! =1); for(j=0;j<4;j++) { if(wuhuivector[q]==Vt[j]) m=j; if(wuhuivector[k]==Vt[j]) n=j; } q=q-1; }while(table[m][n]! =-1); q++; t=wuhuivector.size()-1;//s2是剩余输入串 while(t! =q) { s2=wuhuivector[t]+s2; wuhuivector.pop_back(); t--; } l=0; while((x<6)&&(l! =1)) { if(s2==chanshengshi[x]) l=1; x++; } if(l==0) { cout<<"分析失败! "< warn=0; ret=0; break; } elseif(l==1) { if((x==1)||(x==2)) wuhuivector.push_back(Vn[0]); elseif((x>2)&&(x<7)) wuhuivector.push_back(Vn[1]); s1="规约"; } } (2)设计二进制转十进制函数: a.判断输入的二进制数是否有小数点时的函数: while((j { if(a[j]=='.') k=1; j++; } b.无小数点时的转换函数: if(k==0) { for(l=0;l ans=ans+(a[l]-48)*pow(2,(i-2-l)); } c.有小数点时的转换函数: if(k==1) { for(l=0;l ans=ans+(a[l]-48)*pow(2,(j-2-l)); for(l=j;l ans=ans+(a[l]-48)*pow(2,(j-1-l)); } 5.4运行结果 (1)输入一个正确的二进制数时的运行结果: (2)输入一个带不属于该文法中非终结符的字符串时的运行结果: (3)输入一个无法规约的字符串时的运行结果: 6.总结及体会 在编写这次课程设计的过程中,真的是受益良多。 编译原理虽然平时都一直在看,也自认为看得挺懂的,但是当真正要亲手写个编译器的时候,确实真没想象中那么容易。 虽然在编写之前,已经先构造好了思路,但是在写的过程中,却遇到了一个又一个瓶颈,但好歹还算顺利,都一一解决了。 真正令我头疼的,是编写完开始运行的时候,一个一个的问题就都显现出来了。 由于事先没考虑周全,发现运行结果老是出问题,在一次又一次的排查之后,成功运行出了正确的结果,本以为已经做好了,但在给学长检查的时候才发现之前都没考虑到输入不合法的字符串时的解决方法,在改正这些问题后,才算真正完成了这个编译器。 通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。 能够把学过的计算机编译原理的知识强化,并通过自己设计的程序表现出来,加深了对理论知识的理解,同时也激发了学习的积极性。 7.源代码 #include #include #include #include usingnamespacestd; vector charVn[2]={'S','A'}; charVt[4]={'.','0','1','#'}; stringchanshengshi[6]={"A.A","A","0A","1A","0","1"}; inttable[4][4]={{-999,-1,-1,1},{1,-1,-1,1},{1,-1,-1,1},{-1,-1,-1,0}};//-999表示无关系,1表示先于关系,0表示等价关系,-1表示后于关系 intAnalyze(); voidchange(char*a,inti); intmain() { inti=0,j; chara[50]; cout<<"请输入一个无符号二进制数,并以#结束: "; do{ cin>>a[i]; i++; }while(a[i-1]! ='#'); for(j=i-1;j>=0;j--) myvector.push_back(a[j]); if((Analyze()==1)) change(a,i); return0; } intAnalyze()//语法分析 { intret=1,v=0,warn=1; charc=myvector[myvector.size()-1]; strings1="移进"; vector wuhuivector.push_back('#'); do{ if(((c>='0')&&(c<='9'))||(c=='.')||(c=='#')) { intj,k,l,m,n,p,q,t,x=0; strings2="",s3,s4="",s5=""; if(s1=="移进") { c=myvector[myvector.size()-1]; myvector.pop_back(); } p=wuhuivector.size()-1; while(p>=0) { s4=wuhuivector[p]+s4;//s4是符号串的输出内容 p--; } l=0; k=wuhuivector.size(); do{ k--;//k是符号栈的第一个终结符的下标 j=0; while((j<4)&&(l==0))//找符号栈的最外面一个终结符 { if(wuhuivector[k]==Vt[j]) l=1; else j++; } }while(l! =1); for(j=0;j<4;j++) { if(wuhuivector[k]==Vt[j]) m=j; if(c==Vt[j]) n=j; } if(table[m][n]==-999)//失败 { cout<<"分析失败! "< ret=0; warn=0; break; } elseif(table[m][n]==0) { if(wuhuivector[k]=='#') { warn=0; s1="分析成功! "; } else { wuhuivector.push_back(c); s1="移进"; } } elseif(table[m][n]==-1)//移进 { wuhuivector.push_back(c); s1="移进"; } elseif(table[m][n]==1)//规约 { q=k; do{//找符号栈第二个终结符,寻找最左素短语 l=0; do{ p=0; q--; while((p<4)&&(l==0)) { if(wuhuivector[q]==Vt[p]) l=1; else p++; } }while(l! =1); for(j=0;j<4;j++) { if(wuhuivector[q]==Vt[j]) m=j; if(wuhuivector[k]==Vt[j]) n=j; } q=q-1; }while(table[m][n]! =-1); q++; t=wuhuivector.size()-1;//s2是剩余输入串 while(t! =q) { s2=wuhuivector[t]+s2; wuhuivector.pop_back(); t--; } l=0; while((x<6)&&(l! =1)) { if(s2==chanshengshi[x]) l=1; x++; } if(l==0) { cout<<"分析失败! "< warn=0; ret=0; break; } elseif(l==1) { if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 十进制 语法分析 语义 分析 程序 计算 优先 讲述