视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
编译原理LL1文法实验
2025-09-25 21:43:11 责编:小OO
文档
实验二:自上而下语法分析

一、实验目的和要求

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

根据某一文法编制调试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)#

四、实验总结:

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

显示全文
专题