实验三 自下而上语法分析及语义分析复习进程Word文档格式.docx
- 文档编号:19149051
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:10
- 大小:32.09KB
实验三 自下而上语法分析及语义分析复习进程Word文档格式.docx
《实验三 自下而上语法分析及语义分析复习进程Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验三 自下而上语法分析及语义分析复习进程Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
T->
T*F|T/F|F
F->
(E)|i
上式中,i为整数。
六、处理程序例
例1:
正确源程序例:
23+(45+4)*40分析结果应为:
正确的表达式。
其值为:
1983
例2:
错误源程序例:
5+(56+)-24
分析结果应为:
错误的表达式:
出错位置为)
附录:
源程序
#include<
stdio.h>
#include"
string.h"
iostream>
usingnamespacestd;
#defineR30
#defineC20
typedefstructelem
{
chare[4];
}Elem;
//ACTION表与GoTo表中的元素类型
ElemLR[R][C];
//存放ACTION表与GoTo表中的内容
typedefstructout
intorder;
//序号
intstate[10];
//状态栈
charsign[30];
//符号栈
chargrasen[20];
//产生式
charinput[30];
//输入串
charexplen[50];
//解释说明
}OutNode;
//输出结果中每一行的类型
OutNodeout[20];
//存放输出结果
charSentence[20];
//存放文法的一个句子
charGramSent[10][20];
//存放文法的一组产生式
introw,colno;
//row为状态个数数,colno为ACTION表与GoTo表列总数
intstateTop=0,signTop=0;
//状态栈与符号栈的栈顶位置(值与栈中元素的个数相等)
voidinput_GramSent()
inti,num;
printf("
请输入文法中产生式的个数\n"
);
scanf("
%d"
&
num);
for(i=0;
i<
num;
i++)
请输入文法的第%d个产生式\n"
i);
%s"
GramSent+i-1);
}
请输入文法的一个句子\n"
Sentence);
**********************************************************\n"
*文法的产生式如下:
*\n"
%s\n"
GramSent+i);
*文法的句子如下:
voidinput_LR(introw,intcolno)//row为行总数,colno为列总数
inti,j;
charmid[4];
*提示:
每输入一个元素后就回车*\n"
请输入LR分析表的终结符(包括#)与非终结符\n"
for(j=0;
j<
colno;
j++)
LR[0][j].e);
row;
请输入%d号状态所对应的各列的元素,空白的地方用s代替\n"
mid);
if(strcmp(mid,"
s"
)==0||strcmp(mid,"
S"
)==0)
strcpy(LR[i+1][j].e,"
"
else
strcpy(LR[i+1][j].e,mid);
voidoutput_LR(introw,intcolno)
*LR分析表如下:
\n"
%s"
for(i=1;
=row;
%d"
i-1);
LR[i][j].e);
intSignNum(charch)//给定一个终结符或非终结符,返回其在ACTION表与GoTo表中的列位置
inti;
charc[2]="
0"
;
c[0]=ch;
if(strcmp(c,LR[0][i].e)==0)
returni;
return-1;
intCharChangeNum(char*ch)//给定一数字字符串,返回其所对应的数字
intresult=0;
while(*ch!
='
\0'
)
result=result*10+(*ch-'
0'
ch++;
returnresult;
intOutResult(ints,intc,inti)//输出结果的第i+1行处理函数,(s为状态,c为列)
charmid[4],gra[20];
ints_num,r_num;
intn,len,j;
strcpy(mid,LR[s+1][c].e);
{printf("
不能规约\n"
return-2;
acc"
ACC"
规约成功\n"
out[i+1].order=i+2;
if(mid[0]=='
s'
||mid[0]=='
S'
s_num=CharChangeNum(mid+1);
//s_num为S后的数字
stateTop;
out[i+1].state[j]=out[i].state[j];
out[i+1].state[stateTop]=s_num;
out[i+1].state[++stateTop]=-1;
//完成第i+1行的状态栈赋值
strcpy(out[i+1].sign,out[i].sign);
out[i+1].sign[signTop]=out[i].input[0];
out[i+1].sign[++signTop]='
//完成第i+1行的符号栈的赋值
strcpy(out[i+1].grasen,"
//完成第i+1行的产生式的赋值
strcpy(out[i+1].input,out[i].input+1);
//完成第i+1行的输入符号串的赋值
elseif(mid[0]=='
r'
R'
r_num=CharChangeNum(mid+1);
//r_num为r后的数字
strcpy(gra,*(GramSent+r_num-1));
len=strlen(gra);
len;
if(gra[j]=='
-'
&
&
gra[j+1]=='
>
'
break;
n=strlen(gra+j+2);
stateTop-=n;
signTop-=n;
j=SignNum(gra[0]);
out[i+1].state[stateTop]=CharChangeNum(LR[out[i+1].state[stateTop-1]+1][j].e);
out[i+1].sign[signTop]=gra[0];
strcpy(out[i+1].grasen,gra);
strcpy(out[i+1].input,out[i].input);
return1;
voidOutputResult(intr)
*句子:
%s用LR分析表规约过程如下:
=r;
j=0;
%2d"
out[i].order);
while(out[i].state[j]!
=-1)
out[i].state[j++]);
%s%s%s\n"
out[i].sign,out[i].grasen,out[i].input);
intOutControl()//输出结果的总控函数
ints_num,i=0;
out[0].order=1;
//序号赋值
out[0].state[0]=0;
stateTop=1;
out[0].state[stateTop]=-1;
//状态栈赋值,置栈顶位
strcpy(out[0].sign,"
#"
signTop=1;
//符号栈赋值,置栈顶位
strcpy(out[0].grasen,"
//产生式为空
strcpy(out[0].input,Sentence);
//以下两行为输入串赋值
strcat(out[0].input,"
strcpy(out[0].explen,"
0和#进栈"
//初使化输出结果的第一行
while
(1)
s_num=SignNum(out[i].input[0]);
//if(s_num!
if(OutResult(out[i].state[stateTop-1],s_num,i)!
=1)
i++;
main()
intr;
*函数的输入:
文法的产生式,文法句型的一个句子,LR分析表*\n"
*函数的输出:
LR分析器的工作过程与说明*\n"
请输入LR分析表中终结符与非终结符的总个数\n"
colno);
请输入LR分析表中状态的总个数\n"
row);
input_LR(row,colno);
output_LR(row,colno);
input_GramSent();
r=OutControl();
//r为输出结果的行数
OutputResult(r);
}
七、实验小结
这个程序是从网上下载下来的,根据这个实验要求做了些更改,但是总是出现溢出错误,只能运行到LR分析表的部分(如截图),没有找到解决问题的办法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 自下而上语法分析及语义分析复习进程 实验 自下而上 语法分析 语义 分析 复习 进程