云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 算符优先文法实验报告

算符优先文法实验报告

  • 62 次阅读
  • 3 次下载
  • 2025/12/10 20:43:46

[k]=='#'||C[k]=='\\?'||C[k]=='=')

{//只能用一次,因是算符优先文法,故前两个中必会至少存在一个终结符

setFIRSTVT(C[k],S);//存入FIRSTVT中,S标记产生式的位置 break;//跳出循环保证存入的是最左边的终结符

} }

{//若C[0]中为A~Z,并且C[0]不是X(否则将无限循环),则递归的进行填充 }

int flag=0,count;

for(count=0;count<20;count++) { { } } if(flag==1)

{//递归,所用极妙,画龙点睛 }

if(C[0]>=65&&C[0]<=90&&C[0]!=X)

if(INPUT[count][0]==C[0])//找到将要处理的产生式 flag=1;//若存在,则填充

getFIRSTVT(C[0],S);//S为子集中的元素填入父集中指明了方向

}

else if(INPUT[T][i]!='|'&&INPUT[T][i]!='\\0')//该行没结束,过滤'\\0' {

C[j]=INPUT[T][i];//j从0开始 j++;//移进 }

if(INPUT[T][i]=='\\n') }

{//该行结束 }

break;

}

比如说对于这个文法分析出的集合如下:

模块二:构建优先符号表。

为了体现“优先”的关系,只是构建出了上面的两种集合是不够的,由上面分析我们知道了这两个集合的用处。说白了就是为了构造出算符优先分析表。因为关系无非四类1.等于,2.大于,3.小于,4没有关系。注意这里的“没有关系”也是一种关系。

而由第一个阶段产生的两个集合就可以找到所有的大于和小于关系,那就只剩下了等于关系,如果等于关系找到了,剩余的没有填写的关系就是没有关系。等于关系是这样的:如果存在这样的句型.....ab....或.......aQb.....则关系(a==b)。这样的结果也是显而易见的,因为a和b注定要共同归约,没有谁先谁后,因此是等于关系。

好了现在所有关系都搞请了,就可以建表了。 还是首先解释一下新定义的一个数据结构: char PriorityTable[20][20];

优先关系表,其中存放着终结符以及终结符对应的关系。

然后是一些函数: 1.int IsVT(char ch)

判断ch是否为终结符,若是则返回1,否则返回0 2.int SearchTbl(char ch)

搜索终结符ch在符号表中的行列数,用来定位将要填写的位置。 3.int FL_map(char ch)

这个映射既是查找产生式左部的位置,若存在则返回该产生式的条数,即是第几个产生式,失败则返回-1这个出错标记。 4.void createPriorityTable()

这个是建表的主控程序,用来填写所有关系与表中。遍历所有的产生式,填写所有的关系。这里主要解释一下程序是如何找到横纵坐标并且将关系填写进去的。对

于简单的情况只要拿一个终结符来使用SearchTbl(终结符)就可以找到横(纵)坐标了,但是因为对于大小关系我们往往要填的是“终结符终结符”这样的情况,因此势必要从集合中取出终结符,并用该终结符来映射坐标,即是用到了类似这样的转换:

temp_column=FIRSTVT[FL_map(C[2])][count_1]; tbl_column=SearchTbl(temp_column);//将上述结果再次转换 或者

temp_row=LASTVT[FL_map(C[1])][reg]; tbl_row=SearchTbl(temp_row);//map 这样的映射。知道了这些程序不难读懂。 5.void DisplayPriorityTable()

这个函数就是显示优先关系表的内容的。

下面是 void createPriorityTable() 函数的实现过程: void createPriorityTable() {//创建并填写优先级表 //对每个产生式遍历,求出四种关系1.=,2.<,3.>,4.没有关系 char temp[13]={'+','-','*','/','(',')','v','c','=','?','#','\\0'}; int j,L,i;

int tbl_row,tbl_column;//表的元素坐标 char C[20];

for(int r=1;r<12;r++) {

PriorityTable[0][r]=temp[r-1];//初始化行头,第0行 PriorityTable[r][0]=temp[r-1];//初始化第0列 }

//扫描产生式的右部,如果发现终结符且该终结符周围有其他字符 //若该其他字符为终结符,则这两者关系为相等

//若该其他字符为非终结符,则根据非终结符的firstVT,LastVt填表 for(int p=0;p<4;p++) { j=0;

for(i=4;i<20;i++) {//注意,此处因为时间有限考虑不是很全面,只是对老师给定的文法进行了周密的部署

//在别的文法上可能需要少许加工,不是问题 if(INPUT[p][i]=='|'||INPUT[p][i]=='\\n') {//刚开始走不到这里

L=j;//j指针所指位置为C[]中字符串的长度 j=0;//交给L后就清零,以供下一次使用 if(L>1)//大于一则处理,否则不关心 { //对于清零指令l自动忽略

if(IsVT(C[0])&&IsVT(C[1])||(L==3)&&IsVT(C[0])&&IsVT(C[2])&&(FL_map(C[1])!=-1))

{//若为终结符因至少有两个,若出现两个终结符则C[0]'=='C[1]||C[2],注意这是此文法的情况

//则需要填表,查表找到C[0]的行数,C[1],C[2]的列数进行填表

tbl_row=SearchTbl(C[0]);//记录行数 if(IsVT(C[1])) {//列数,若是终结符 v= tbl_column=SearchTbl(C[1]); } if(IsVT(C[2])&&(L==3)) {//列数 (E) tbl_column=SearchTbl(C[2]); } PriorityTable[tbl_row][tbl_column]='=';//填表

if((L==3)&&IsVT(C[0])&&IsVT(C[1])&&(FL_map(C[2])!=-1))

{//v=E,这种情况 int count_1=0; char temp_column; tbl_row=SearchTbl(C[1]);// =

tbl_column=SearchTbl(temp_column);//将上述结果再次转换

PriorityTable[tbl_row][tbl_column]='<';//填写关系 count_1++;//准备填写下一个 } count_1=0;//清零 }

if((L==3)&&IsVT(C[0])&&IsVT(C[2])&&(FL_map(C[1])!=-1))

{//弥补(E),针对本文法 //首先填写<关系 char temp_row,temp_column; int reg=0; tbl_row=SearchTbl(C[0]); while(FIRSTVT[FL_map(C[1])][reg]!='\\0') {//填写小于关系 '('

搜索更多关于: 算符优先文法实验报告 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

[k]=='#'||C[k]=='\\?'||C[k]=='=') {//只能用一次,因是算符优先文法,故前两个中必会至少存在一个终结符 setFIRSTVT(C[k],S);//存入FIRSTVT中,S标记产生式的位置 break;//跳出循环保证存入的是最左边的终结符 } } {//若C[0]中为A~Z,并且C[0]不是X(否则将无限循环),则递归的进行填充 } int flag=0,count; for(count=0;count<20;count++

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com