论文—简单优先文法

上传人:油条 文档编号:12799432 上传时间:2017-10-20 格式:DOC 页数:7 大小:247.50KB
返回 下载 相关 举报
论文—简单优先文法_第1页
第1页 / 共7页
论文—简单优先文法_第2页
第2页 / 共7页
论文—简单优先文法_第3页
第3页 / 共7页
论文—简单优先文法_第4页
第4页 / 共7页
论文—简单优先文法_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《论文—简单优先文法》由会员分享,可在线阅读,更多相关《论文—简单优先文法(7页珍藏版)》请在金锄头文库上搜索。

1、简单优先文法分析设计一、摘要众所周知,翻译有两种方式:编译方式和解释方式,其中编译程序的主要功能是将源程序翻译成等价的目标程序,这个翻译过程一般可分为词法分析、语法分析、语义分析、中间代码生成、中间代码优化和目标代码生成等阶段来实现。 在众多阶段中,语法分析是相当重要的一部分,其任务是根据语言的语法规则把单词符号串分解成各类语法单位,如表达式、语句等。通过语法分析,可以确定整个输入符号串是否够成一个语法正确的程序。在本文中,我们将重点探讨语法分析部分的简单优先分析法。简单优先分析法是一种典型的自下而上的分析方法。自下而上分析法是从输入符号串出发,试图归约到文法的识别符号,或从下往上地为输入串构

2、造一棵语法树。对这个“可进行归约的符号串” ,在不同的自下而上分析方法中有着不同的称呼,在简单优先分析法中称之为“句柄” ,而在算符优先分析方法中称之为“素短语” 。关于简单优先文法分析器,主要分为三大部分:数据结构及界面的设置、优先关系矩阵的求解、符号串的分析。文法分析器使用 VS2008 编译器编译,主要是使用其强大的界面设计功能。由于水平有限,本文或许有不妥之处,敬请读者不吝指教。二、基本概念简单优先分析法对使用它的文法是有限制的,只有简单优先文法才能使用简单优先分析法。在介绍简单优先文法之前,我们先来看一下三种简单优先关系。LR,当且仅当文法中有以下形式的产生式: U:=LR。其中,L

3、,R(VNVT);,(V N VT)*。LR,当且仅当文法中有以下形式的产生式:U:= WP 且 W L,P R。其中,L,R(VNVT );WV N;P (VNVT );,(VNVT)*。有了上面三种优先关系的说明,我们再来看一下简单优先文法的定义。满足以下条件的文法称为简单优先文法:字母表中的任意两个符号之间之多存在一种简单优先关系;文法的任意两条产生式都没有相同的右部。如文法 GS: S:=(R)|a,R:=T ,T:=S,T|S 是一种简单优先文法。下面我们再来看一下移进及规约。移进过程:将输入符号串从左到右逐个移进符号栈。规约过程:栈顶符号串与某一产生式右部相匹配成为可规约符号串时,

4、将此符号串规约为一个非终结符,这个非终结符是该产生式左部符号。在简单优先分析法中,我们用三种优先关系来判断符号栈面临当前符号的操作时移进还是规约,若为前两种则为移进,第三种则为规约。而在规约过程中,我们用句柄来搜索用来规约的文法。 一个句型中的最左直接短语,称为该句型的句柄。一个句型的直接短语和句柄可以用其语法树的子树描述。语法树的一棵简单子树(只有单层的子树)的叶子结点组成的符号串是这个句型关于简单子树根结点的一个直接短语。语法树最左边的简单子树的叶子结点组成的符号串就是这个句型的句柄。例如:对于上面提到的文法 GS,子串(R) 即为符号串(R),a) 的句柄。三、程序运行效果为了方便理解后

5、文的编程思路,我们先来看一下程序要达到的效果,如图 1。图 1 合法语句运行结果看了上面的程序运行结果,相信您已经对简单优先分析法有了一定的了解,下面就让我们来具体看一下简单优先文法分析器的设计思路吧。4、设计思路(1)文法结构的定义public struct MyData /文法结构定义(为方便分析将文法分为两部分)public string s1, s2; /s1 为文法的非终结符部分(等号前) ,s2 为后半部分public int s2_length; /s2 的长度(方便使用) public int N = 50; /最多能输入的文法条数public MyData gam = new

6、 MyDataN; /将所有文法都保存在数组中public int num = 0; /记录输入的文法条数(2)优先关系矩阵的求法分析优先关系的定义,不难得到以下结果:由知:两个连在一起的字符关系为“” ;由知:两个连在一起的字符,若后者 P 为非终结符,则前者 L后者 P 及其推导的首字符(有推导时) 。 根据以上理解,不难看出第一种关系求解过程相对简单,后两种则相对复杂。为求解后两种关系,我们先来求解非终结符的推导的首、尾字符。这里我使用递归的方法求推导,并将要求解的字符保存在字符串中,下面是求解算法。/此函数寻找ch的部分推导(可能有多个推导,但我们只需其中一部分)的第一个字符priva

7、te string SearchDerivation(char ch,int depth) string str=;if (depth = A & gami.s20 = A & ch1 1)for(int j=1;j=A&gami.s2j=A&gami.s2j-1= A & gami.s2j )window.listView1.Itemsrow3.SubItemscol3.Text = ;elseMessageBox.Show(不是简单优先文法!); (3)符号串的分析(流程图) 流程图中,S 为符号栈,栈顶指针为 i;TR 为字符数组,用来存储输入符号串,j 为下标。令# 。在寻找句型的句柄

8、时,总是先找到句柄的尾符号,然后再搜索其首符号。找到句柄后,就用它去查文法的产生式表,若存在匹配的文法(右部与句柄相同) ,则用该产生式的左部符号去替换符号栈中的这个句柄。最后如果 Si为文法识别符号,而TRj为“#” ,则表示输入符号串是文法的一个句子,算法终止,否则则是非法的语句。具体实现过程的核心代码如下(其中 OutPut() 用于输出分析过程,SearchGam() 用于搜索匹配的文法,由于二者实现过程比较简单,这里也不多说):public void Analyse(Form1 window) /分析过程(填分析表)string S = #, TR = window.textBox3

9、.Text + #; int num=1;while(true)if (SS.Length-1 = #) OutPut(window,num, S, ) OutPut(window,num,S,window.listView1.Itemsrow.SubItemscol.Text,TR,入栈);num+; S+= TR0; TR=TR.Remove(0,1); continue; else /下面为向上规约int k =S.Length-1;while(k0)int row2 = SearchPosition(window, Sk - 1, Sk).row;int col2 = SearchPo

10、sition(window, Sk - 1, Sk).col;if (Sk-1=#|window.listView1.Itemsrow2.SubItemscol2.Text = ,TR,SearchGam(gs2).s1+:=+SearchGam(gs2).s2);num+;S = S.Remove(k); S+= SearchGam(gs2).s1;continue;elseif (SS.Length - 2 = # & TR0 = #) OutPut(window, num, S, OK, TR, OK); break; else OutPut(window, num, S, ERROR,

11、 TR, ERROR); break; 五、总结及感受通过本次文法分析器的编写,我学到了文法分析方面的一些知识点,但更重要的是获取了一些编程方面的经验,同时也感受到了自己的不足点。在编程方面,我觉得没构思好就不要开始写,否则容易导致结构混乱,即便是最终将程序写出来了也不便于维护。同时我感觉自己在编程方面基本功不够,积累的知识点太少以致不能得心应手。算法可以随时思考,但知识点却得慢慢积累,因此我觉得以后要下大功夫积累知识点,同时将精力集中在某一方面,力求精一门,了解多门。时光匆匆,而任重道远。大学的日子不多了,但我所学到的东西确是少之又少,感觉远远不能满足社会的要求。然而知识一道,仰之弥高,钻之弥深。求知虽难,但其中亦有不少乐趣,况且要想有所作为,又岂能畏惧艰难! 路漫漫其修远兮,吾将上下而求索。在剩下的日子里,我将厚积薄发,多关注社会对本专业的要求,以便快速使自己所学具有实际意义。没有比脚更长的路,没有比人更高的山。我相信只要我打好基础,即便在短时间内不能有所作为,但终将会有出人头地的一天。参考文献: 1 何炎祥. 编译原理M. 华中科技大学. 20052 Simon Robinson. C#高级编程M. 清华大学出版社. 2005

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号