实验四 语法分析程序
(一)学习经典的语法分析器(1学时)
一、实验目的
学习已有编译器的经典语法分析源程序。
二、实验任务
阅读已有编译器的经典语法分析源程序,并测试语法分析器的输出。
三、实验内容
(1)选择一个编译器,如:TINY,其它编译器也可(需自备源代码)。
(2)阅读语法分析源程序,加上你自己的理解。尤其要求对相关函数与重要变量的作用与功能进行稍微详细的描述。若能加上学习心得则更好。TINY语言请参考《编译原理及实践》第3.7节。对TINY语言要特别注意抽象语法树的定义与应用。
(3)测试语法分析器。对TINY语言要求输出测试程序的字符形式的抽象语法树。(手工或编程)画出图形形式的抽象语法树。
TINY语言:
测试用例一:sample.tny。

(二)实现一门语言的语法分析器(3学时)
一、实验目的
通过本次实验,加深对语法分析的理解,学会编制语法分析器。
二、实验任务
用C或C++语言编写一门语言的语法分析器。
三、实验内容
(1)语言确定:C-语言,其定义在《编译原理及实践》附录A中。也可选择其它语言,不过要有该语言的详细定义(可仿照C-语言)。一旦选定,不能更改,因为要在以后继续实现编译器的其它部分。鼓励自己定义一门语言。也可选择TINY语言,但需要使用与TINY现有语法分析代码不同的分析算法实现,并在实验报告中写清原理。
(2)完成C-语言的BNF文法到EBNF文法的转换。通过这一转换,消除左递归,提取左公因子,将文法改写为LL(1)文法,以适用于自顶向下的语法分析。规划需要将哪些非终结符写成递归下降函数。
(3)为每一个将要写成递归下降函数的非终结符,如:变量声明、函数声明、语句序列、语句、表达式等,定义其抽象语法子树的形式结构,然后定义C-语言的语法树的数据结构。
(4)仿照前面学习的语法分析器,编写选定语言的语法分析器。可以自行选择使用递归下降、LL(0)、LR(0)、SLR、LR(1)中的任意一种方法实现。
(5)准备2~3个测试用例,测试并解释程序的运行结果。

实验过程

学习tiny语言的语法分析器

TINY有两种基本的结构类型:语句和表达式。语句共有5类:(if语句、repeat语句、assign语句、read语句和read语句),表达式共有3类(算符标的是、常量表达式和标识符表达式)。因此,语法树节点首先安装它是语句还是表达式来进行分类,接着根据语句或表达式的种类进行再次分类。
树节点最大可有3个孩子的结构(仅在带有else部分的if
语句才用到)。语句通过同属域而不是子域来排序,即由父亲到他的孩子的唯一物理连接是到最左孩子的。孩子则在一个标准连接表中自左向右连接到一起,这种连接称作同属连接,用于区别父子连接。

设计流程:

  1. 创建一个树节点的结构体

  2. 使用递归下降算法,将每一个文法产生式转变成递归函数中的一个子句

  3. 用前看符号指导产生式规则的选择

  4. 创建一个match函数,对前看符号进行匹配,如果不匹配,调用syntaxError函数对错误语法进行报错。

  5. 创一个printTree函数,将一个语法树打印出来。

实现C-语言的语法分析器

  1. 完成C-语言的BNF文法到EBNF文法的转换。通过这一转换,消除左递归,提取左公因子,将文法改写为LL(1)文法,以适用于自顶向下的语法分析。规划需要将哪些非终结符写成递归下降函数。

C-语言BNF语法:

EBNF语法:
a) program→declaration-list
b) declaration_list → declaration{ declaration }
c) declaration→var-declaration|fun-declaration
d) var_declaration →type-specifier ID; | type-specifier ID [NUM];
e) type - specifier → int | void
f) fun-declatation→type-specifier ID (params) compound-stmt
g) params→param_list | void
h) param_list→param{, param}
i) param→ type-specifier ID{[ ]}
j) compound-stmt→{ local-declaration statement-list}
k) local-declarations → empty {var- declaration}
l) statement-list→{statement}
m) statement→expression-stmt | compound-stmt | selection-stmt | iteration-stmt | return-stmt
n) expression-stmt→ [expression];
o) selection-stmt→if (expression) statement [else statement]
p) iteration-stmt→while (expression)statement
q) return-stmt→return [expression];
r) expression→ var = expression | simple-expression
s) relop → < = | < | > | > = | = = | ! =
t) var→ID | ID [expression]
u) simple-expression>additive-expression{ relop additive-expression }
v) additive-expression→term{addop term }
w) addop → + | -
x) term→factor{mulop factor }
y) mulop →* | /
z) factor→(expression) | var | call | NUM
aa) call→ID( args )
bb) args→arg-list | empty
cc) arg-list→ expression{, expression}
2. 创建一个树节点,treeNode定义 包括子节点、兄弟节点、所处行号、节点类型、属性、表达式返回类型
3. 定义各类所需的数据类型,有些数据类型在词法分析器中已经完成,可以直接使用。
4. 使用递归下降算法,将每一个文法产生式转变成递归函数中的一个子句

  1. 创建一个match函数,对前看符号进行匹配,如果不匹配,调用syntaxError函数对错误语法进行报错。
  2. 创一个printTree函数,将一个语法树打印出来。
  3. 其他一些非主要函数,继承了上次词法分析器的代码。如字符读取等。而且整个实验是建立在词法分析得基础上的。词法分析的结果对于语法分析是必不可少的

实验结果:

C-语言:

测试样例一:

测试结果:

源码太长了,就不贴上来了。大家需要的可以去下载。
C-语言语法分析程序

编译原理实验四 C-语言 语法分析程序相关推荐

  1. 编译原理-实验四-LR(0)语法分析程序的设计

    一.实验目的 了解LR(0)语法分析算法的基本思想,掌握LR(0)语法分析程序的构造方法. 二.实验内容 根据LR(0)语法分析算法的基本思想,设计一个对给定文法进行LR(0)语法分析的程序,并用C. ...

  2. 编译原理-实验二-LL(1)语法分析程序的设计

    一.实验目的 了解LL(1)分析器的基本构成及用自顶向下的LL(1)方法对表达式进行语法分析的方法,掌握LL(1)语法分析程序的构造方法. 二.实验内容 根据LL(1)语法分析算法的基本思想,设计一个 ...

  3. 中山大学编译原理实验——实现PL0语言的编译程序(无坑有缩进版)

    PL0-Compiler 代码传送门 ps:吐槽一下,老师给的代码实在是太烂了.又没缩进又多编译错误,除此之外还有很多细节漏掉关键字,总之就很多坑,所以这里发一个无坑带缩进版,方便大家学习. 中山大学 ...

  4. 笔记-编译原理-实验四-语义分析与中间代码生成

    实验四. 语义分析及中间代码生成 设计思想 根据对属性文法及语义分析.中间代码生成的学习,可以将实验二.三的两种语法分析器进行一定的改造,以达到进行语法分析的同时进行语义分析并生成中间代码.根据PL0 ...

  5. 编译原理——实验壹——TINY语言的词法分析

    一. 实验目的 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造.构造出的扫描器,能够读入tiny语言的示例代码,分解成token输出. 掌握使用lex工具 掌握构造词法分析 ...

  6. 编译原理实验2(1)——自上而下语法分析

    一.实验目的 1.为初等函数运算语言构造LL(1)语法分析器. 2.掌握LL(1)语法分析器的方法,加深对自上而下语法分析原理的理解. 3.掌握设计.编制并调试LL(1)语法分析程序的思想和方法. 二 ...

  7. 编译原理实验一 TINY语言的词法分析

    实验一 TINY语言的词法分析 一.实验目的 (评价依据,描述是否准确到位) 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造.实验结果:构造出的扫描器,能够读入教材样例中给 ...

  8. 编译原理实验代码c语言,编译原理实验 简单词法分析(含源代码和实验结果)

    可直接运行 原创!! 附录一 实验报告样式 <编译原理>实验报告 实验2 简单词法分析 姓名 陈婷婷 学号 1009050121 班级 计科1001班 时间: 2012/4/5 地点:文波 ...

  9. 编译原理实验报告三:语法分析(PL0,词法分析,语法分析,中间代码生成)

    实验报告三:语法分析 一.实验目的 通过设计.开发一个S语言的语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容的理解,提高语法分析方法的实践能力. 二.实验要求        根 ...

  10. 编译原理—实验二LL(1)语法分析(一)

    一.实验目的 1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题. 2. 复习高级语言及线性表.栈.图等典型数据结构,进一步加强用高级语言来解决实际问题的能力. 二. ...

最新文章

  1. air什么意思中文_Air译中文是什么意思,the air中文是什么意思
  2. qt5.5.1配置winpcap4.1.2
  3. 计算机片段教学优秀教案,精彩教学片段100例—导入篇(1)
  4. java实现傅里叶变换
  5. tomcat vue 不用 前后端_部署前后端分离项目(后端 tomcat 前端 nginx)
  6. 目标检测(二): meanshift与camshift算法
  7. mysql建考勤信息代码_C++嵌入式SQL写考勤/点名功能程序
  8. linux-查看CPU温度
  9. 解决No backends or directors found in VCL program, at least one is necessary. Runn
  10. PESniffer4PEiD plugin from NEOx's 0depts by Slip
  11. 安装python的时候遇到的问题,无法安装bz2modules等
  12. 倍福触摸屏维修倍福工控机维修CP3916-0010详解
  13. 无密码登陆的ssh和ssh-agent
  14. 最简单的磁盘分区教程
  15. python 爬虫 付费代理
  16. Bqq服务器的缓存文件放什么目录,如何清除Android应用程序缓存?
  17. WordPress博客主题 大前端DUX6.1主题绿色版
  18. QT开发之调用其它类中的UI控件的方法
  19. 【深度学习21天学习挑战赛】4、初尝循环神经网络(RNN)——股票预测
  20. php提取视频中的音频-ffmpeg

热门文章

  1. java 生成水印_Java实现图片生成水印
  2. 名利双收的公益创业,“汇新杯”响应时代召唤助力公益创业
  3. C#调用默认浏览器打开网页的几种方法
  4. WebView内通过浏览器打开链接
  5. java实现向PDF中插入图片
  6. pc端自适应不同屏幕
  7. 硬编码支持情况(一)
  8. 理论+实验:Apache网页与安全优化(网页压缩、网页缓存、隐藏版本信息、网页图片防盗链)
  9. 计算机等级考试 设置表格居中,Word表格水平居中怎么设置
  10. 程序员如何通过努力出书做到名利双收的!