语法分析代码.docx

上传人:b****2 文档编号:1269090 上传时间:2022-10-19 格式:DOCX 页数:10 大小:18.60KB
下载 相关 举报
语法分析代码.docx_第1页
第1页 / 共10页
语法分析代码.docx_第2页
第2页 / 共10页
语法分析代码.docx_第3页
第3页 / 共10页
语法分析代码.docx_第4页
第4页 / 共10页
语法分析代码.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

语法分析代码.docx

《语法分析代码.docx》由会员分享,可在线阅读,更多相关《语法分析代码.docx(10页珍藏版)》请在冰豆网上搜索。

语法分析代码.docx

/*

第三次上机-语法分析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==')')

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1