编译原理语法分析实验.docx

上传人:b****1 文档编号:23072341 上传时间:2023-04-30 格式:DOCX 页数:13 大小:212.17KB
下载 相关 举报
编译原理语法分析实验.docx_第1页
第1页 / 共13页
编译原理语法分析实验.docx_第2页
第2页 / 共13页
编译原理语法分析实验.docx_第3页
第3页 / 共13页
编译原理语法分析实验.docx_第4页
第4页 / 共13页
编译原理语法分析实验.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

编译原理语法分析实验.docx

《编译原理语法分析实验.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析实验.docx(13页珍藏版)》请在冰豆网上搜索。

编译原理语法分析实验.docx

编译原理语法分析实验

编译原理程序设计实验报告

语法分析器的构造——实验题目

班级:

计算机1306姓名:

韩远磊学号:

20133948

实验目标:

实现一个能够完成语法分析任务的语法分析器,按照源语言的语法规则,从词法分析的结果中识别出相应的语法范畴,同时进行语法检查。

给定文法G和字符串R(R∈VT*),检查、判定R∈L(G)?

即检查、判定R是否是文法G所能产生的合法的句子,同时报告和处理语法错误。

实验内容:

语法分析器设计

文法:

G(E):

E->T|Eω1T

T->F|Tω2F

F->i|(E)

其中:

ω1(+,-),ω2(*,/),i(变量或常数)

(1)递归子程序是根据文法各产生式的首符号与当前所读单词进行匹配,以决定候选产生式的;这就要求文法:

①具有相同左部的各产生式,首符号不同;②文法不能有左递归!

消除左递归后的文法1:

流程图:

主程序

子程序E

子程序T

子程序F

(2)LL

(1)分析法是指从左到右扫描、最左推导(LL)和只查看一个当前符号(括号中的1)之意;

LL

(1)分析法又称预测分析法,与递归子程序法同属于自顶向下确定性语法分析方法;

※LL

(1)分析法的基本要点有三:

⑴利用一个分析表,登记如何选择产生式的知识;

⑵利用一个分析栈,记录分析过程;

⑶此分析法要求文法必须是LL

(1)文法。

※此文法含左递归,不是LL

(1)文法;经文法变换(消除左递归)后可得:

G`(E)的选择集合:

构造LL

(1)分析表:

 

LL

(1)分析法控制程序:

源程序代码:

(1)递归子程序

#include

#include

#include

voidE();

voidT();

voidF();

voidE1();

voidT1();

voidread();

voiderror();

charm[100];

inti=0;

intmain()

{

printf("请输入表达式:

");

gets(m);

E();

if(m[i]!

='#')

error();

elseprintf("表达式正确!

");

return0;

}

voidread()

{

i=i+1;

}

voiderror()

{

printf("表达式错误!

");

}

voidE()

{

T();

E1();

}

voidE1()

{

if(m[i]=='+'||m[i]=='-')

{

read();

T();

E1();

}

}

voidT()

{

F();

T1();

}

voidT1()

{

if(m[i]=='*'||m[i]=='/')

{read();

F();

T1();

}

}

voidF()

{

if(m[i]=='(')

{

read();

E();

if(m[i]!

=')')

error();

}

else

{

if(m[i]!

='i')

error();

}

read();

}

(2)LL1

#include

#include

#include

#defineSTACKSIZE50

#defineSTACKINCREMENT10

typedefcharSElemType;

typedefintStatus;

typedefstruct

{

SElemType*base;

SElemType*top;

intstacksize;

}SqStack;

StatusInitStack(SqStack&S)//初始化

{

S.base=(SElemType*)malloc(STACKSIZE*sizeof(SElemType));

if(!

S.base)

exit(-1);

S.top=S.base;

S.stacksize=STACKSIZE;

return1;

}

StatusPush(SqStack&S,SElemTypee)//压栈

{

if(S.top-S.base>=S.stacksize)//判断栈是否满啦

{

S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));

if(!

S.base)

exit(-1);

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

(S.top)++;

*(S.top)=e;

return1;

}

StatusPop(SqStack&S,SElemType&e)//弹栈

{

if(S.top==S.base)//判断栈是否为空

return0;

e=*(S.top);

S.top--;

return1;

}

StatusGrammerAnalysis(SqStack&S,char*ch,charc)//分析函数

{

chare;

Push(S,'#');//先把#号压与栈

Push(S,'E');

while(!

((*(S.top)=='#')&&(c=='#')))

{

Pop(S,e);

if((e=='E')&&(((c>='0')&&(c<='9'))||(c=='(')||((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))||c=='.'))

{

Push(S,'A');

Push(S,'T');

}

elseif((e=='A')&&((c=='+')||(c=='-')))

{

Push(S,'A');

Push(S,'T');

ch++;

c=*ch;

}

elseif((e=='A')&&((c==')')||(c=='#')))

;

elseif((e=='T')&&(((c>='0')&&(c<='9'))||(c=='(')||((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))||c=='.'))

{

Push(S,'B');

Push(S,'F');

}

elseif((e=='B')&&((c=='*')||(c=='/')))

{

Push(S,'B');

Push(S,'F');

ch++;

c=*ch;

}

elseif((e=='B')&&((c=='+')||(c==')')||(c=='#')||(c=='-')))

;

elseif((e=='F')&&((c>='0')&&(c<='9')||((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))||c=='.'))

{

ch++;

while(((c=*ch)>='0')&&(c<='9')||((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))||c=='.')

ch++;

}

elseif((e=='F')&&(c=='('))

{

Push(S,')');

Push(S,'E');

ch++;

c=*ch;

}

elseif((e==')')&&(c==')'))

{

ch++;

c=*ch;

}

elsereturn0;

}

return1;

}

intmain()

{

charstr[50];

charc;

SqStackS;

InitStack(S);

printf("请输入一个正确的表达式,并以#号键结束\n");

scanf("%s",str);

c=*str;

if(GrammerAnalysis(S,str,c))

printf("表达式正确\n");

else

printf("表达式不正确\n");

return0;

}

程序运行结果:

输出:

(1)递归下降

(2)LL1

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

当前位置:首页 > 党团工作 > 党团建设

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

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