LL(1)语法分析器实验报告_第1页
LL(1)语法分析器实验报告_第2页
LL(1)语法分析器实验报告_第3页
LL(1)语法分析器实验报告_第4页
LL(1)语法分析器实验报告_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

LL〔1〕语法分析器实验报告篇一:LL(1)语法分析实验报告

?编译原理?课程实验报告

课程实验题目:

作者所在系部:

作者所在专业:

作者所在班级:

作者学号:

作者姓名:

指导教师姓名:

完成时间:

一、实验目的LL(1)语法分析实验计算机科学与工程系计算机科学与技术xxxxxxx

理解预测分析表方法的实现原理。

二、实验内容及要求

编写一通用的预测法分析程序,要求有一定的错误处理才能,出错后可以使程序继续运行下去,直到分析过程完毕。可通过不同的文法〔通过数据表现〕进展测试。

给定算术表达式文法,编写程序。

测试数据:

1.算术表达式文法

E→TE’

E’→+TE’|-TE’|ε

T→FT’

T’→*FT’|/FT’|%FT’|ε

F→(E)|id|num

2.作业3.10文法

三、实验程序设计说明

1.实验方案设计

主要函数之间的调用关系如下列图所示:

2.程序源代码

源代码如下:

#include

#include

#include

usingnamespacestd;

structNode1

{charvn;

charvt;

chars[10];

}MAP[20];//存储分析预测表每个位置对应的终结符,非终结符,产生式intk;

//用R代表E',W代表T',e代表空

charstart='E';

intlen=8;

char

G[10][10]={"E->TR","R->+TR","R->e","T->FW","W->*FW","W->e","F->(E)","F->i"};//存储文法中的产生式

charVN【6】={'E','R','T','W','F'};//存储非终结符

charVT【6】={'i','+','*','(',')','#'};//存储终结符

charSELECT[10][10]={"(,i","+","),#","(,i","*","+,),#","(","i"};//存储文法中每个产生式对应的SELECT集

charRight[10][8]={"->TR","->+TR","->e","->FW","->*FW","->e","->(E)","->i"};//用R代表A',W代表B',e代表空

/*charstart='A';

intlen=6;

charG[10][10]={"A->aR","R->ABl","R->e","B->dW","W->bW","W->e"};charVN【6】={'A','R','B','W'};

charVT【6】={'a','d','b','#','l'};

charSELECT[10][10]={"a","a","d,#","d","b","l"};

charRight[10]【6】={"->aR","->ABl","->e","->dW","->bW","->e"};*/

stackstak;

boolpare(char*a,char*b)

{inti,la=strlen(a),j,lb=strlen(b);

for(i=0;ifor(j=0;j{if(a[i]==b[j])

return1;}

return0;}

char*Find(charvn,charvt)

{inti;

for(i=0;i{if(MAP[i].vn==vnMAP[i].vt==vt)

returnMAP[i].s;}

return"error";}

char*Analyse(char*word)

{charp,action[10],output[10];

inti=1,j,l=strlen(word),k=0,l_act,m;

while(!stak.empty())

stak.pop();

stak.push('#');

stak.push(start);

printf("___________________________________________________________\n");printf("\n对符号串%s的分析过程\n",word);printf("-----------------------------------------------------------------------\n");printf("\n");

printf("步骤栈顶元素剩余输入串动作\n");

printf("-----------------------------------------------------------------------\n");p=stak.top();

while(p!='#')

{printf("%7d",i++);

p=stak.top();

stak.pop();

printf("%6c",p);

for(j=k,m=0;joutput[m++]=word[j];

output[m]='\0';

printf("%10s",output);

if(p==word[k])

{if(p=='#')

{printf("分析成功\n");

return"SUCCESS";}

printf("匹配终结符“%c〞\n",p);

k++;}

else

{strcpy(action,Find(p,word[k]));

if(strcmp(action,"error")==0)

{printf("没有可用的产生式\n");

return"ERROR";}

printf("展开非终结符%c%s\n",p,action);

intl_act=strlen(action);

if(action[l_act-1]=='e')

continue;

for(j=l_act-1;j>1;j--)

stak.push(action[j]);}

}if(strcmp(output,"#")!=0)

return"ERROR";

}

intmain()

{freopen("in1.txt","r",stdin);

//freopen("in2.txt","r",stdin);

charsource[100];

inti,j,flag,l,m;

//printf("\n***为了方便编写程序,用R代表E',W代表T',e代表空*****\n\n");printf("\n****为了方便编写程序,用R代表A',W代表B',e代表空*****\n\n");

printf("该文法的产生式如下:\n");

for(i=0;iprintf("%s\n",G[i]);

printf("___________________________________________________________\n");printf("\n该文法的SELECT集如下:\n");

for(i=0;i{printf("SELECT(%s)={%s}\n",G[i],SELECT[i]);}

printf("___________________________________________________________\n");//判断是否是LL(1)文法

flag=1;

for(i=0;i{for(j=i+1;j{if(G[i][0]==G[j][0])

{if(pare(SELECT[i],SELECT[j]))

{flag=0;break;}

}

}if(j!=8)

break;}

if(flag)

printf("\n有一样左部产生式的SELECT集合的交集为空,所以文法是LL〔1〕文法。\n");

else

printf("\n有一样左部产生式的SELECT集合的交集不为空,所以文法不是LL〔1〕文法。\n");

printf("___________________________________________________________\n");//预测分析表

for(i=0,k=0;i{l=strlen(SELECT[i]);

for(j=0;j{MAP[k].vn=G[i][0];

MAP[k].vt=SELECT[i][j];

strcpy(MAP[k].s,Right[i]);

k++;}}

printf("\n表达式文法的预测分析表如下:\n\n");

printf("");

for(i=0;iprintf("%10c",VT[i]);

printf("\n");

for(i=0;i{printf("---------------------------------------------------------------\n");printf("%10c",VN[i]);

for(j=0;j篇二:语法分析器实验报告

曲阜师范大学实验报告

软件工程一班组计算机系2022年级

日期2022-11-12

姓名王战海学号2022416596

实验名称:语法分析实验

一、实验目的:

1、通过完成预测分析法的语法分析程序,理解预测分析法和递归子程序法的区别和联络;

2、理解语法分析的功能,掌握语法分析程序设计的原理和构造方法;

3、训练掌握开发应用程序的根本方法。

二、实验内容:

1、根据某一文法编制调试LL〔1〕分析程序,以便对任意输入的符号串进展分析;

2、构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序;

3、分析法的功能是利用LL〔1〕控制程序根据显示栈栈顶内容、向前看符号以及LL〔1〕分析表,对输入符号串自上而下的分析过程。

三、实验要求:

1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

2、假设遇到错误的表达式,应输出错误提示信息。

3、对以下文法,用LL〔1〕分析法对任意输入的符号串进展分析:

〔1〕S->TE

〔2〕E->+TE|$

〔3〕T->FM

〔4〕M->*FM|$

〔5〕F->(E)|i#

四、实验环境:

WindowsXP

Eclipse,J2SE1.6

五、实验分析:

〔一〕设计思想

〔1〕定义局部:定义常量、变量、数据构造。

〔2〕初始化:设立LL(1)分析表、初始化变量空间〔包括堆栈、构造体、数组、临时变量等〕;

〔3〕控制局部:从键盘输入一个表达式符号串;

〔4〕利用LL(1)分析算法进展表达式处理:根据LL(1)分析表对表达式符号串进展堆栈〔或其他〕操作,输出分析结果,假设遇到错误那么显示错误信息。

〔二〕分析的流程图

〔三〕算法设计

#include

#include

intvnNum,grammarNum,vtNum=6;

intorder;

intcount=1;

charGrammar[20][10],BlankTerminate[20]【2】;charFirst【5】【4】={'S','(','i','\0',

'E','+','$','\0',

'T','(','i','\0',

'M','*','$','\0',

'F','(','i','\0'};

charFollow【5】【6】={'S',')','#','\0','\0','\0','E',')','#','\0','\0','\0','T','+',')','#','\0','\0','M','+',')','#','\0','\0','F','*','+',')','#','\0'};charSelect[8]【4】={'(','i','\0','\0',

'+','\0','\0','\0',')','#','\0','\0',

'(','i','\0','\0',

'*','\0','\0','\0','+',')','#','\0',

'(','\0','\0','\0',

'i','\0','\0','\0'};intIndiBlanket【6】【7】;

charVT[10]={'i','+','*','(',')','#'};

typedefstruct{

char*base;

char*top;

intstacksize;

}AnalStack;

AnalStackS;

intScanGrammar()

{

FILE*fp=fopen("文法.txt","r");FILE*tp;

charsingleChar,nextChar;inti=0,j=0;while(!feof(fp)){fscanf(fp,"%c",singleChar);if(singleChar=='#'){Grammar[i][j]='\0';break;}if(singleChar=='\n'){Grammar[i][j]='\0';i++;j=0;continue;}if(singleChar=='-'){tp=fp;fscanf(tp,"%c",nextChar);if(nextChar=='>'){fp=tp;continue;}}if(singleChar=='|'){Grammar[i+1][0]=Grammar[i][0];Grammar[i][j]='\0';i++;j=1;continue;}Grammar[i][j]=singleChar;j++;}

//printf("输入的文法:\n");

for(intk=0;k{

j=0;

while(Grammar[k][j]!='\0'){

if(j==1)

{

//

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论