编译原理-编写递归下降语法分析器

编译原理上机报告

名 称: 编写递归下降语法分析器

学 院: 信息与控制工程学院

专 业: 计算机科学与技术

班 级: 计算机1401班

姓 名: 叶达成 年 月

一、上机目的

通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标:

1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。

2、掌握词法分析的实现方法。

3、上机调试编出的词法分析程序。

二、基本原理和上机步骤

递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。

递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。

每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。

自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。

无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。

无左递归:既没有直接左递归,也没有间接左递归。

无回溯:对于任一非终结符号U的产生式右部x1|x2|…|xn,其对应的字的首终结符号两两不相交。

如果一个文法不含回路(形如P⇒+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。

三、上机结果

测试数据:

(1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#

(2)输出结果:i+i*i#为合法符号串

(3)输入一符号串如i+i*#,要求输出为“非法的符号串”。

程序清单:

#include

#include

char str[50];

int index=0;

void E();

void X();

void T();

void Y();

void F();

int main()

{

int len;

int m; /*递归分析*/ //E->TX; //X->+TX | e //T->FY //Y->*FY | e //F->(E) | i

printf("请输入要测试的次数:");

scanf("%d",&m);

while(m--)

{

}

void E()

{

{

if(str[index]=='+')

{

} }

void T()

{

{

} }

void F()

{

if(str[index]=='i')

{

{

index++; E(); if(str[index]==')') { { printf("\n非法的符号串!\n"); index++; }else index++; } else if (str[index]=='(') F(); Y(); } if(str[index]=='*') { index++; F(); Y(); void Y() index++; T(); X(); T(); X();} void X() printf("请输入字符串(长度):\n"); scanf("%s",str); len=strlen(str); //str[len]='#'; str[len+1]='\0'; E(); printf("%s为合法符号串!\n",str); strcpy(str,""); index=0; } return 0;

else

{

}

} } exit (0); } printf("非法的符号串!\n"); exit(0);

屏幕截图:

四、讨论与分析

通过本次实验对递归下降词法分析器的结构,过程有了更进一步的了解,通过学习书本和试验原理书上的内容,对它的工作原理,具体实行步骤有了进一步的掌握,由于本次试验是测试性试验,所以要求输出的结果是成功与否,输入一个句型,进过分析,判断它是否合法,主要内容在于其判断过程中。本次试验不光提高了自己的编程能力,同时提高了对递归下降的了解。

编译原理上机报告

名 称: 编写递归下降语法分析器

学 院: 信息与控制工程学院

专 业: 计算机科学与技术

班 级: 计算机1401班

姓 名: 叶达成 年 月

一、上机目的

通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标:

1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。

2、掌握词法分析的实现方法。

3、上机调试编出的词法分析程序。

二、基本原理和上机步骤

递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。

递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。

每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。

自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。

无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。

无左递归:既没有直接左递归,也没有间接左递归。

无回溯:对于任一非终结符号U的产生式右部x1|x2|…|xn,其对应的字的首终结符号两两不相交。

如果一个文法不含回路(形如P⇒+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。

三、上机结果

测试数据:

(1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#

(2)输出结果:i+i*i#为合法符号串

(3)输入一符号串如i+i*#,要求输出为“非法的符号串”。

程序清单:

#include

#include

char str[50];

int index=0;

void E();

void X();

void T();

void Y();

void F();

int main()

{

int len;

int m; /*递归分析*/ //E->TX; //X->+TX | e //T->FY //Y->*FY | e //F->(E) | i

printf("请输入要测试的次数:");

scanf("%d",&m);

while(m--)

{

}

void E()

{

{

if(str[index]=='+')

{

} }

void T()

{

{

} }

void F()

{

if(str[index]=='i')

{

{

index++; E(); if(str[index]==')') { { printf("\n非法的符号串!\n"); index++; }else index++; } else if (str[index]=='(') F(); Y(); } if(str[index]=='*') { index++; F(); Y(); void Y() index++; T(); X(); T(); X();} void X() printf("请输入字符串(长度):\n"); scanf("%s",str); len=strlen(str); //str[len]='#'; str[len+1]='\0'; E(); printf("%s为合法符号串!\n",str); strcpy(str,""); index=0; } return 0;

else

{

}

} } exit (0); } printf("非法的符号串!\n"); exit(0);

屏幕截图:

四、讨论与分析

通过本次实验对递归下降词法分析器的结构,过程有了更进一步的了解,通过学习书本和试验原理书上的内容,对它的工作原理,具体实行步骤有了进一步的掌握,由于本次试验是测试性试验,所以要求输出的结果是成功与否,输入一个句型,进过分析,判断它是否合法,主要内容在于其判断过程中。本次试验不光提高了自己的编程能力,同时提高了对递归下降的了解。


相关文章

  • 编译原理学习导论 [和讯博客]
  • 文章来源: 转贴www.csdn.net 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容.编译原理 ...查看


  • 软件编译技术课程总结
  • 软件编译技术论文 学号: 姓名: 班级: 摘要 软件编译技术是计算机及相关专业的一门重要专业课程,在计算机科学中有很重要的地位和作用,已被国内外高校列为计算机专业的主要课程.它主要介绍了高级程序设计语言编译程序构造的一般原理.基本设计方法. ...查看


  • 编译原理所有名词解释
  • 编译程序是一种程序,它把高级语言编写的源程序翻译成与之在逻辑上等价的机器语言或汇编语言的目标程序. 一个高级语言程序的执行通常分为两个阶段,即编译阶段和运行阶段.如果编译生成的目标程序是汇编语言形式,那么在编译与运行阶段之间还要添加一个汇编 ...查看


  • 语法分析程序的设计与实现
  • 语法分析程序的设计与实现 一:实验内容: ................................................................................................... ...查看


  • 期末考试编译原理试卷及答案
  • 一. 填空题(每空2分,共20分) 1. 不同的编译程序关于数据空间的存储分配策略可能不同,但大部分编译中采用的方案有两种:静 态存储分配方案和动态存储分配方案,而后者又分为(1) 和 (2) . 2. 规范规约是最(3)规约. 3. 编译 ...查看


  • 编译原理 预测分析法实验
  • 课 程 设 计 书 目 录 一.设计内容·····························································1 二.目的与基本要求···························· ...查看


  • 高级语言编译过程可视化研究
  • 高级语言编译过程可视化研究 摘要:针对编译原理教学中存在的知识点多.概念抽象.算法难 于理解的情况,本文设计了一种可视化编译系统,实现了类c 语言 的文法编辑与检查.词法分析.语法分析.语义处理的过程展示. 系统界面布局一致.操作简便,为便 ...查看


  • 北航程序设计语言原理教材第02章
  • 第2章程序设计语言的设计概述 本章介绍程序设计语言的设计目标以及为实现这些目标所遵循的设计准则,设计语言最后要给出语言的参考手册,为此,从表示的角度介绍与语法,语义和上下文约束有关的概念和表示法.目前在程序语言语法文本中,语法形式表示是完整 ...查看


  • 语法分析 递归下降分析法
  • 实验2 一.实验目的语法分析--递归下降分析法 1.通过该课程设计要学会用消除左递归的方法来使文法满足进行确定自顶向下分析的条件. 2.学会用C/C++高级程序设计语言来设计一个递归下降分析法的语法分析器:3.通过该课程设计,加深对语法分析 ...查看


热门内容