最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

编译原理LL1文法实验

来源:动视网 责编:小OO 时间:2025-09-25 21:43:11
文档

编译原理LL1文法实验

实验二:自上而下语法分析一、实验目的和要求根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。(选做)根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。(必做)本次实验的目的主要是加深对自上而下分析法的理解。二、实验内容1.功能描述:LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。对下列文法,对任意输入的符号串进行分析:(1)E->TG(2)G->+TG(3)G->ε(4)
推荐度:
导读实验二:自上而下语法分析一、实验目的和要求根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。(选做)根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。(必做)本次实验的目的主要是加深对自上而下分析法的理解。二、实验内容1.功能描述:LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。对下列文法,对任意输入的符号串进行分析:(1)E->TG(2)G->+TG(3)G->ε(4)
实验二:自上而下语法分析

一、实验目的和要求

根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。(选做)

根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。(必做)

本次实验的目的主要是加深对自上而下分析法的理解。

二、实验内容

1.功能描述:

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

对下列文法,对任意输入的符号串进行分析:

(1)E->TG

(2)G->+TG 

(3)G->ε

(4)T->FS

(5)S->*FS

(6)S->ε

(7)F->(E)

(8)F->i

输入一以#结束的符号串(包括+—*/()i#):

输出结果:包括分析栈、数组中的剩余字符串以及所用的产生式,形如:

分析栈剩余输入串所用产生式
Ei+i*i#E->TG
设计思想及算法:

2.程序结构描述:

2.1参数含义

struct Stack{

char  s[30];

int top; //栈顶指针

}S1;

char b[20];

char v1[6]={'i','+','*','(',')','#'};//终结符

char v2[5]={'E','G','T','S','F'};//非终结符

/*用二维数组保存预测分析表,可用符号^来代替ε,注意字符串结束位自动加'\\0'   */

2.2返回值描述

void print()/*无返回值  */

intiszhongjie(char X )返回数组下标

intfeizhongjie(char f )返回数组下标

boolchabiao(char X,charsym)bool型返回false和true

2.3函数功能

void print()/*输出分析栈  */

intiszhongjie(char X )判断X是否为终结符,是返回数组下标

intfeizhongjie(char f )判断X是否为非终结符,是返回数组下标

boolchabiao(char X,charsym)判断X是否为非终结符,sym是否为终结符,若是查找预测表对应表格是否为空白,是则出错,否则进栈

fopen  文件打开函数,返回指向文件第一个字符的指针

2.4函数之间的调用关系图

3.程序源代码

//用二维数组保存预测分析表

char table[5][6][4]={{"TG

{" 

{"FS

{" 

{"i

//查表函数,在预测分析表中判断X是否为非终结符,sym是否为终结符,若是查找预测表对应表格是否为空白,是则出错,否则进栈

  匹配失败!"<     return false;

     

     if (str[0]!='^')

     {

      for (inti=strlen(str)-1;i>=0;i--)

     push(str[i]);

       

      

     cout<<'\'<"<     return true;

      

}

主函数:根据表中的产生式,对栈顶元素根据情况进行移进匹配操作,知道剩余表达式中无非终结符为止,即匹配成功。否则,则匹配失败,给出的字符表达式无法由给定的文法推出。

int main()

printbiao();

     file.getline(b,sizeof file);

charsym,X;

boolflag,cuo;

if((fp=fopen("D:\\\\111.txt

 读取文件内容,并返回文件指针,该指针指向文件的第一个字符

fprintf(stderr,"读取文件失败!\\n");

exit(1);

     

 把第一个输入符号读进sym

     X=pop();

     if (X=='#') 

     {

      flag=false;

   匹配成功"<     }

     else if(iszhongjie(X)!=-1)

  sym=fgetc(fp);}

     else if(!chabiao(X,sym)){

      cuo=true;

     }

     

}

三、实验过程记录:

出错次数3次、

出错严重程度不高、

解决办法摘要:

第一次错误是语法错误,加括号改正

第二次读取文件的文件位置写错

第三次是函数调用错误,改错。

实验结果截图:

i+i*i#

i*(i+i)#

四、实验总结:

本次实验较上次稍难,主要是移近匹配已经判断的思想和流程要充分的理解到位。虽然,老师课上已经讲解了许多,而且实验时也指导了我们一些该注意的地方,但是,在真正编程的过程中还是遇到了许多问题,比如说,如何用一个数组实现让字符串逆序进栈,以及文件的读取和存取内容的相关操作。当然问题最多的还是栈顶元素与剩余字符串的移进匹配过程,这一点我老是搞不太清楚。不过在同学的帮助和指导下这些问题都慢慢的解决了。本次试验共花费了四天时间,历时教长,当然程序中依然存在很多问题,比如对匹配失败的具体原因没有详细显现出来。不过总体来说,使我的编程能力得到了很大的提高。

文档

编译原理LL1文法实验

实验二:自上而下语法分析一、实验目的和要求根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。(选做)根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。(必做)本次实验的目的主要是加深对自上而下分析法的理解。二、实验内容1.功能描述:LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。对下列文法,对任意输入的符号串进行分析:(1)E->TG(2)G->+TG(3)G->ε(4)
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top