您现在的位置:网站首页答辩论文计算机毕业设计计算机论文计算机软件

简单优先分析器

  • 简介:(毕业论文 字数:5475 页数:32)摘 要:编译程序的工作过程通常是词法分析、语法分析、语义分析、代码生成、代码优化。编译程序的这些过程的执行先后就构成了编译程序的逻辑结构,但是这些逻辑结构不一定是按照某一个固定顺序的,也有可能是按照平行或者...
    • 请与管理员联系购买资料 QQ:5739126
  • 论文简介
  • 相关论文
  • 论文下载

(毕业论文 字数:5475 页数:32)摘 要:编译程序的工作过程通常是词法分析、语法分析、语义分析、代码生成、代码优化。编译程序的这些过程的执行先后就构成了编译程序的逻辑结构,但是这些逻辑结构不一定是按照某一个固定顺序的,也有可能是按照平行或者互锁的方式执行的。
本次课程设计是就简单优先文法原理来做一个简单优先分析器,简单优先分析 文法按一定的法的基本思想是对一个文法按一定的原则求出该文法所有符号包括终结符和非终结符之间的优先关系按照这种关系确定规约过程中的句柄,它的规约过程实际上是规范规约。在算法实现过程中,主要使用visual C++进行编程。

关键词:简单优先关系,大于关系,小于关系,等于关系

 

目 录

摘要 ………………………………………………………………………………
第1章 绪论 ………………………………………………………………………
1.1 实验环境与开发工具 ……………………………………………………
1.2 简单优先文法简介 ………………………………………………………
1.3 基本概念 ……………………………………………………………………
第2章 需求分析
2.1 总体功能需求……………………………………………………….
2.2 系统的主要功能函数…………………………………………………
2.3系统的设计思想……………………………………………………………
第3章 详细设计
3.1 等于关系模块
3.2 小于关系模块
3.3 等于关系模块
3.4 句子识别模块


第4章 界面设计……………………………………………………………………

第5章结论与展望
参考文献 ……………………………………………………………………………19
附录
源程序 ……………………………………………………………………………21

第1章 绪 论
1.1 实验环境与开发工具
硬件环境:处理器AMD 3000+ 内存 1G 硬盘 160G
显示器AOC L192W 256M显卡
软件环境:VC++6.0

1.2 简单优先文法简介
简单优先分析 文法按一定的法的基本思想是对一个文法按一定的原则求出该文法所有符号包括终结符和非终结符之间的优先关系按照这种关系确定规约过程中的句柄,它的规约过程实际上是规范规约。简单优先分析法准确、规范,但分析效率很低,实际使用价值不大。

1.3基本概念
一个文法是简单优先文法,则必须得满足以下条件:
(1) 在文法符号集V中,任意两个符号之间最多只有一种优先关系成立。
(2) 在文法中任意两个产生式没有相同的右部。
其中第一条不许满足是显然的,第二条要是不满足则会出现归约不唯一。

1.4优先关系

简单优先分析法是按照文法符号(终结符和非终结符)的优先关系确定句柄的。
首先定义优先关系的表示:
X=Y 表示X和Y的优先关系相等。
X>Y表示X的优先性比Y的优先性大。
X<Y 表示X的优先性比Y的优先性小。
这样我们就可对已知文法中的任意两个文法符号X,Y按其在句型中可能会出现的相邻关系来确定它们的优先关系。
(1) X=Y 当且仅当G中存在产生式规则A→…XY…
(2) X<Y 当且仅当G中存在产生式规则A→…XB…,且B→Y…
(3) X>Y当且仅当G中存在产生式规则A→…BD…,且B→…X和D→Y…
第2章 需求分析

2.1 总体功能需求

1 给定一个文法识别它是否为正规文法
2 能判断该文法的优先关系
3给出该文法的优先关系矩阵
2.2系统的主要功能函数
1主函数:
void main()
{
loop: simple f;
loop2:f.check ();
}

2下面是主函数所涉及到的重要函数:

(1) 函数声明:void init()
函数功能:给输入栈分配内存空间

(2)函数声明:void clear ()
{ B_stack.clear ();
pos=0;
}
函数功能:清空栈

(3)函数声明:bool input();
函数功能:输入规则,默认第一个非终结符号为文法标识符

(4)函数声明: void print_bool(char c);
函数功能:输入布尔矩阵

(5)函数声明: void print(vector<string>m);
函数功能:打印布尔矩阵

(6)函数声明:void XU_LIE();
函数功能:为输入的文法符号排序

(7)函数声明:void B_EQUAL();
函数功能:求等于关系的布尔矩阵

(8)函数声明:void B_SMALL();
函数功能:求小于关系的布尔矩阵

(9)函数声明:void B_LARGE();
函数功能:求大于关系的布尔矩阵

(10)函数声明:void B_HEAD_TAIL();
函数功能:分别求head和tail的布尔矩阵

(11)函数声明:voidcheck ();
函数功能:识别程序看所输入的文法是否符合要求

(12)函数声明:void check_1();
函数功能:检查是否包含非该文法符号的符号,有,则不是文法的句子,否则继续识别
fencha
(13)函数声明:void get_symbol()
{
char c=s[pos++];
relation(c);
} ;
函数功能:依次取符号

(14)函数声明:void relation(char c);
{int x=symbol.find (c);
int y
。。。。。。。
}
函数功能:输入两字符来判断它们的优先关系

(15)函数声明:void find_simple();
函数功能:找最左简单短语

(16)函数声明: void GUI_YUE(int k);
函数功能:规约

(18) 函数声明:void result();
函数功能:打印识别的结果


2.3系统设计思想
简单分析法的基本思想是对一个文法按一定的原则求出该文法所有符号即包括终结符和非终结符之间的优先关系,按照这种关系确定规约过程中的句柄。我们首先是要识别文法是否为正规文法,是的就构建相应的优先关系矩阵,并将文法的产生式保存,设置符号栈。然后依次求出大于,等于,小于关系的布尔矩阵。
第3章 详细设计

3.1 等于关系模块

当输完文法的左部和右部后。如果文法中存在产生式规则A->…XY… ,
则X,Y的优先关系为:X=Y(表示X,Y的优先级相等)

例如:S->aAb
则有:a=A A=b

void simple::B_EQVAL()
{
for(int i=1;i<size();i++){
if(right[i].length()==1)continue;
for(int j=1;j+1<right[i].length();j++)
{ int x=symbol.find(right[i][j]);
int y=symbol.find(right[i][j+1]);
B_equal[x][y]='1'
}
}
//cout<<"B_= "<<endl;
//print(B_equal);
}

结合所有部分程序并执行后:

Compiling……
simple.cpp
D\实验\simple.cpp(189):error c2065:'size':undeclared identifier
D\实验\simple.cpp(197):error c2143:syntax error:missing';'before'}'
执行c1.exe时出错
simple.exe-error(s),0warning(s)

修改程序后(i<right.size() B_equal[x][y]='1';)
再执行,发现结果是错的:
对产生式:A->aBd B->Db D->BDa

A 0 0 0 0 0 0
B 0 0 0 0 0 0
D 0 0 0 1 0 0
a 0 0 0 0 0 0
d 0 0 0 0 0 0
b 0 0 0 0 0 0

对程序再修改( for循环中的修改,把1变成0 )

void simple::B_EQVAL()
{
for(int i=0;i<right.size();i++){
if(right[i].length()==1)continue;
for(int j=0;j+1<right[i].length();j++)
{ int x=symbol.find(right[i][j]);
int y=symbol.find(right[i][j+1]);
B_equal[x][y]='1';
}
}
//cout<<"B_= "<<endl;
//print(B_equal);
}

对产生式:A->aBd B->Db D->BDa

执行结果:

A 0 0 0 0 0 0
B 0 0 1 0 1 0
D 0 0 0 1 0 1
a 0 1 0 0 0 0
d 0 0 0 0 0 0
b 0 0 0 0 0 0

结果是正确的,程序无误。

3.2 小于关系模块


小于关系的算法及调试
求小于关系的方法为: X<Y 当且仅当G中存在产生式规则A→…XB…,且B Y…
例如有文法G[S]:
S→bAb A→(B|a B→Aa)
根据上述定义得到的小于关系有::由S→bAb且A (B,A a可得:
b<(,b<a.
对于一个给定的文法,根据定义来求出它的优先关系较为简单,然后将其存入一个矩阵,当进行语法分析时,对符号串进行识别时再来对照查询优先关系矩阵来确定是移进还是规约,这样就给定的文法是比较简单的。但是现在要求编制一个能适应大多数的文法的优先关系函数,功能是随意给出一个文法就可以得到它的优先关系,然后再将这些关系存入矩阵,然后接下来的步骤和上述给定的文法的处理方法一样。

查看评论 已有0位网友发表了看法
  • 验证码: