1 实验目的

理解和掌握算术表达式的文法构造,熟悉常用的语法分析方法。

2 实验内容

根据Sample语言的语法规则判定输入的一串单词能否构成一个正确的算术表达式。

3 实验方案

3.1方案描述

        递归下降所需要的文法如表1,大概流程图如图1。

表1 递归下降所需文法表

类型

文法构造

表达式

算术

<表达式>→

<算术表达式>|<关系表达式><布尔表达式>

<算术表达式>→<项><算术表达式’>

<算术表达式’>→+<项><算术表达式’>|-<项><算数表达式’>|ε

<项>→<因子><项’>

<项’>→*<因子><项’>|/<因子><项’>|%<因子><项’>|ε

<因子>→(<算术表达式>)|<值>|<标识符>|<函数调用>

布尔

<布尔表达式>→ <布尔项>||<布尔表达式> | <布尔项>

<布尔项>→<布尔因子>&&<布尔项>|<布尔因子>

<布尔因子>→ <算术表达式>|<关系表达式>|!<布尔表达式>

关系

<关系表达式>→<算术表达式><关系运算符><算术表达式>

<关系运算符>→>|>=|<|<=|==|!=

声明

语句

变量

<声明>→<函数声明><声明> |<变量定义><声明> |ε

<变量定义>→<返回值> <标识符> <初值>;

<初值>→=<值>| ε;

函数

<函数声明>→<返回值> <标识符> (<形参列表>) ;

<参数列表>→<变量类型> <标识符> <参数列表 0>|ε

<参数列表’>→,<参数列表>|ε

<形参列表>→<变量类型> <形参列表’>|ε

<形参列表’>→,<形参列表>|ε

<变量类型>→int| float| char

执行语句

<赋值语句>→<标识符>= <表达式>;| <标识符>= <函数调用>;

<控制语句>→<if语句>|<for 语句>|< while 语句>| <do while 语句> |< return 语句>

<函数调用>→<标识符>(<实参列表>);

<循环退出>→< break>|< continue>

<实参列表>→<值> <实参列表’>|ε

<实参列表’>→,<实参列表>|ε

<值>→<整数值>|<浮点数值>|<字符值>

<表达式>→<算术表达式>|<关系表达式><布尔表达式>

< if语句>→if(<布尔表达式>)<程序段><else 语句>

<else语句>→else<程序段>|ε

<for语句>→for (<赋值语句> ;<布尔表达式> ; <赋值语句>)<程序段>

<while语句>→while( (布尔表达式)<程序段>

<dowhile语句→do<程序段>while(<布尔表达式>);

<return语句>→return <返回值> ;

<返回值>→<值>|ε

函数

定义

<函数定义>→<返回值><标识符> (<参数列表>) <程序段>

<返回值>→void |<变量类型>

程序

入口

<程序>→<声明> main() <程序段>

<程序段>→{<各种语句>}

<各种语句>→<赋值语句> <各种语句> |<控制语句><各种语句> |<变量定义><各种语句>|<函数调用><各种语句>|<循环退出><各种语句>|ε

1 递归下降语法分析执行流程图

3.2方案分析

本实验采用递归下降的语法分析法,主要依靠文法,每个非终结符抽象为一个函数。

·递归下降优点:

(1)实现思想简单,程序结构和语法规则直接对应

(2)因为每一个过程表示一个非终结符号的处理,添加语义加工工作比较方便

·递归下降缺点:

(1)文法要求高,必须要LL(1)文法

(2)递归导致效率十分低下不利于大型程序的分析

4 实验测试

设计测试数据一共6组,如表2所示。

2 测试数据

测试数据组数

测试数据

预期结果

实际结果

1

(1)对声明语句、表达式、函数定义、选择语句的语法判断。

(2)无任何报错信息

2

  1. 函数定义、声明语句、while语句、dowhile语句的语法判断
  2. 输出缺少’)’、缺少’while’、未知符号’}’的错误信息

3

  1. 函数定义、声明语句、赋值语句、FOR语句、控制语句的语法判断
  2. 输出未知符号’,’、缺少’;’的错误信息

4

  1. 函数定义、声明语句、赋值语句、表达式、函数调用语句、控制语句的语法判断
  2. 输出缺少’)’、缺少’;’的错误信息

5

  1. 对函数声明、函数定义等模块的处理
  2. 无报错信息

5实验结论及分析

(1)本实验在词法分析识别出正确的单词符号串的基础上,能够对单词串进行算术表达式、布尔表达式、条件语句、循环语句等进行分析,判断读入的单词符号是否符合语言的语法规则,通过所有测试用例,同时进行语法检查和错误处理,为语义分析和代码生成做准备,其过程如图2。

图2 语法分析器

(2)递归下降分析法要求文法是LL(1)文法,有两种表达形式,文法表达式与状态转换图,其对比如表3。

3 文法表达式与状态转换图对比

文法表达式

状态转换图

表达形式

E →TE'

E'→ +TE' |ε

T→ FT'

T' →*FT' |ε

F →(E) |i

非终结符

每个函数对应于文法的一个非终结符。

每个非终结符都对应一个状态转换图,边上的标记式终结符和非终结符。

代码形式

不断递归,若遇到不符的字符(无状态路径可走)就为错误信息

编译原理——语法分析(递归下降)相关推荐

  1. 编译原理实验-递归下降语法分析器的构建

    实验目的: 针对给定的上下文无关文法,编制一个递归下降分析程序. 分析: 递归下降语法分析的前提是保证LL(1)文法 递归下降的思路就是暴力dfs.对每个程序直接不管三七二十一搜进去,只要能搜到就继续 ...

  2. 【编译原理】递归下降的预测分析(真の能看懂~!)

    文章目录 1 递归下降分析法 2 过程 3 示例 3.1 主函数 3.2 PROGRAM 3.3 DECLIST 3.4 DECLISTN 1 递归下降分析法 递归下降分析法是确定的自上而下分析法,这 ...

  3. 编译原理|递归下降分析子程序

    递归下降分析子程序 一.实验目的 掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递归调用程序的构造方法. 二.实验内容 给定CP语言中简单算术表达 ...

  4. 递归下降分析法的基本思想。_语法分析 | 递归下降分析算法

    递归下降分析算法是自顶向下分析算法的一部分. 递归下降分析算法 也称为预测分析 分析高效(线性时间) 容易实现(方便手工编码) 错误定位和诊断信息准确 被很多开源和商业的编译器所采用 GCC 4.0, ...

  5. 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器

    05-01: Introduction to Parsing 语法分析 parser的作用: 05-02: Context Free Grammars 上下文无关文法 CFG(上下文无关文法)回答了一 ...

  6. C++:编译实验之递归下降分析器

    一.实验目的 1.加深对递归下降分析法一种自顶向下的语法分析方法的理解. 2.根据文法的产生式规则消除左递归,提取公共左因子构造出相应的递归下降分析器. 二.实验内容 根据课堂讲授的形式化算法,编制程 ...

  7. 自上而下的语法分析-递归下降分析和LL(1)文法

    对输入的任意单词符号串,试图用一切可能的办法,从文法开始符号(树根)出发,自上而下.自左而右地建立起一棵语法分析树,使得该树的叶结点自左而右地排列起来,刚好就是所给的输入串.显然,这一过程应该与一个最 ...

  8. 编译原理 | 语法分析(LL(1)分析法/算符优先分析法OPG)学习笔记及例子详解

    语法分析(自顶向下 / 自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析 ...

  9. 编译原理语法分析之LR分析

    要求: (1)根据给定文法,先对文法进行解析,构造识别活前缀的DFA并输出: (2)根据DFA构造LR分析表并输出: (3)分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程) (4) ...

最新文章

  1. Java中使用Jedis操作Redis
  2. 男神鹏:人工智能人脸识别操作。
  3. 数学建模——逻辑回归模型Python代码
  4. 方法 手写promise_高级前端养成37js专精06之手写promise(上)
  5. 使用轮转算法求时间片_彩票调度算法,让进程们拼手气? --当操作系统遇上随机算法...
  6. Java从入门到精通——调错篇之SVN 出现 Loced错误
  7. [机器学习]XGBoost 和 LightGBM 参数对比与调参
  8. python类库31[文件和目录os+os.path+shutil]
  9. win10无法运行C语言文件,主编告诉你win10打不开pdf文件的详尽处理办法
  10. python入门——P37类和对象:面向对象编程
  11. Qt4_在次线程中使用Qt的类
  12. Quartz定时任务
  13. java jaas_JAAS 参考指南
  14. 物联网设备接入流程与平台架构
  15. 在手机/平板上安装kali系统
  16. 文献阅读1:Deep Learning for Image Super-resolution: A Survey
  17. 医疗图像三维重建方法小结(python+VTK+ITK+Mayavi)
  18. 圣诞树代码,c语言编程,基于graphics.h
  19. 未来 5 年的 5 大技术趋势
  20. skype检测softice的解决办法

热门文章

  1. KOA 初探 洋葱模型
  2. 马云最新内部讲话:996是员工的巨大福气!你怎么看?
  3. 计算机一级需要考哪些项目,计算机一级考什么
  4. 2023实习面试公司【三】
  5. java基础05 GUI简单动画
  6. GPS项目实战系列1:GPS数据解析1
  7. 杨辉三角python代码
  8. Java 代码实现一个标准输出的进度条,知识点你知道但并不一定会用
  9. 大话数据结构 一 概述
  10. Flash全屏功能测试