语法分析代码.docx
- 文档编号:1269090
- 上传时间:2022-10-19
- 格式:DOCX
- 页数:10
- 大小:18.60KB
语法分析代码.docx
《语法分析代码.docx》由会员分享,可在线阅读,更多相关《语法分析代码.docx(10页珍藏版)》请在冰豆网上搜索。
/*
第三次上机-语法分析1
目的:
熟练掌握自上而下的语法分析方法,并能用程序实现。
要求:
1.使用的文法如下:
ETE
E+TE|ε
TFT
T*FT|ε
F(E)|id
2.对于任意给定的输入串(词法记号流)进行语法分析,递归下降方法和非递归预测分析方法可以任选其一来实现。
3.要有一定的错误处理功能即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。
可以参考书上介绍的同步记号集合来处理。
可能的出错情况:
idid*id,id**id,(id+id,+id*+id……
4.输入串以#结尾,输出推导过程中使用到的产生式。
例如:
输入:
id+id*id#
输出:
ETE'
TFT'
Fid
E+TE'
TFT'
……
如果输入串有错误,则在输出中要体现是跳过输入串的某些记号了,还是弹栈,弹出某个非终结符或者是终结符了,同时给出相应的出错提示信息。
比如:
idid*id对应的出错信息是:
"输入串跳过记号id,用户多输入了一个id";
id**id对应的出错信息是:
"弹栈,弹出非终结符F,用户少输入了一个id"
(id+id对应的出错信息是:
"弹栈,弹出终结符),用户少输入了一个右括号(或者说,括号不匹配)"
有余力的同学可进一步考虑如下扩展:
1. 将递归下降方法和非递归预测分析方法都实现
2. 在语法分析的过程中调用前两次上机的结果,即利用词法分析器来返回一个记号给语法分析器。
3. 编写First和Follow函数,实现其求解过程。
*/
#include
#include
#include
#include
chara[50],b[50];
charch;
intn1,i1=0,flag=1,n=5,signal=0;
inttotal=0;/*步骤计数器*/
intE();
intT();
intE1();/*E'*/
intT1();/*T'*/
intF();
voidinput();
voidinput1();
voidmain()/*递归分析*/
{
intf,j=0;
printf("请输入字符串(长度<50,以#号结束)\n");
do{
scanf("%c",&ch);
a[j]=ch;
j++;
}while(ch!
='#');
n1=j;
ch=b[0]=a[0];
printf("步骤\t文法\t\t分析串\t\t分析字符\t剩余串\n");
f=E();
if(f==0)return;
if(ch=='#')
printf("accept\n");
else
{
printf("!
!
!
!
error\n");
return;
}
printf("\n");
}
intE()
{intf,t;
printf("%d\tE-->TE'\t\t",total);total++;
flag=1;
input();
input1();
if(i1==0)
{
while(ch=='+'||ch=='*')
{
if(ch=='+')//+i
{
b[i1]=ch;printf("%d\t?
?
?
?
?
\t\t",total);total++;
flag=0;input();input1();
printf("串首部多输入了一个+!
error\n");
ch=a[++i1];
}
if(ch=='*')//*i
{
b[i1]=ch;printf("%d\t?
?
?
?
?
\t\t",total);total++;
flag=0;input();input1();
printf("串首部多输入了一个*!
error\n");
ch=a[++i1];
}
}
}
f=T();
if(f==0)return(0);
t=E1();
if(t==0)return(0);
elsereturn
(1);
}
intT()
{intf,t;
printf("%d\tT-->FT'\t\t",total);total++;
flag=1;
input();
input1();
f=F();
if(f==0)return(0);
t=T1();
if(t==0)return(0);
elsereturn
(1);
}
intE1()
{intf,t;
if(ch=='+')
{
b[i1]=ch;
printf("%d\tE'-->+TE'\t",total);total++;
flag=0;
input();input1();
ch=a[++i1];
if(ch=='+')//i++i
{
b[i1]=ch;printf("%d\t?
?
?
?
?
\t\t",total);total++;
flag=0;input();input1();
printf("少输入了一个i!
error\n");
ch=a[++i1];
}
if(ch=='*')//i+*i
{
b[i1]=ch;printf("%d\t?
?
?
?
?
\t\t",total);total++;
flag=0;input();input1();
printf("少输入了一个i!
error\n");
ch=a[++i1];
}
f=T();
if(f==0)return(0);
t=E1();
if(t==0)return(0);
elsereturn
(1);
}
printf("%d\tE'-->ε\t\t",total);total++;
flag=1;
input();input1();
return
(1);
}
intT1()
{
intf,t;
if(ch=='*'){
b[i1]=ch;printf("%d\tT'-->*FT'\t",total);total++;
flag=0;
input();input1();
ch=a[++i1];
if(ch=='*')//i**i
{
b[i1]=ch;printf("%d\t?
?
?
?
?
\t\t",total);total++;
flag=0;input();input1();
printf("少输入了一个i!
error\n");
ch=a[++i1];
}
if(ch=='+')//i*+i
{
b[i1]=ch;printf("%d\t?
?
?
?
?
\t\t",total);total++;
flag=0;input();input1();
printf("少输入了一个i!
error\n");
ch=a[++i1];
}
f=F();
if(f==0)return(0);
t=T1();
if(t==0)return(0);
elsereturn
(1);
}
printf("%d\tT'-->ε\t\t",total);total++;
flag=1;
a[i1]=ch;
input();input1();
return
(1);
}
intF()
{intf;
if(ch=='(')
{
b[i1]=ch;printf("%d\tF-->(E)\t\t",total);total++;
flag=0;signal=1;
input();input1();
ch=a[++i1];
f=E();
if(f==0)return(0);
if(ch==')')
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法分析 代码