OUC编译原理实验报告 实验5:用Yacc设计语法分析器1 实验6:用Yacc设计语法分析器2

news2024/12/23 22:31:05

编译原理实验报告

实验5:用Yacc设计语法分析器1

实验6:用Yacc设计语法分析器2

中国海洋大学编译原理实验2023春
仅供同学参考思路 请勿直接抄袭 否则可能喜提0分

目录

文章目录

  • 编译原理实验报告
  • 目录
    • 一.实验目的
    • 二.实验内容
        • 实验5
        • 实验6
    • 三.实验要求
        • 实验5
        • 实验6
    • 四.实验过程及重点内容
        • 实验5:
        • 实验6:
    • 五.实验结果
        • 实验5:
        • 实验6:

一.实验目的

学习如何使用Yacc设计一个语法分析器,并与用lex写的词法分析器链接起来。

学习如何使用Lex和Yacc设计一个语法分析器,并学习如何在语法分析的同时生成分析树。

二.实验内容

实验5

使用yacc为实验2所给的语言写一个语法分析器(你可以重新设计该语言的文法,但不能改变语言)。其中,词法分析使用实验3中已完成的词法分析器(即,你需要将本实验的语法分析器和实验3的词法分析器链接起来)。

实验6

修改实验5,给产生式加上动作,动作为生成一棵语法分析树。这棵分析树的结构可以使用或参照例子parser1中ast.h文件中定义的分析树结构。

三.实验要求

实验5

输入为实验2所给语言写的源程序文件;输出为屏幕显示语法分析是否成功。

在语法分析中不能出现任何的冲突(移进-归约或归约-归约冲突),或者虽然有冲突,但是你能够说清楚冲突是如何解决的。

在实验环境下用flex,bison和gcc工具将实验调试通过,并且你写的语法分析器至少应该能通过例子parser0中testcases目录下的test0.p和test1.p两个测试例的测试。

实验6

输入为实验2所给语言写的源程序文件;输出为一棵语法分析树,这棵语法分析树的表示方法可以是这样两种:1.将分析树的数据结构打印出来;2.按分析树的结构输出一个C语言源程序文件(即输入是所给语言的源程序文件,输出为语义相同的C语言源程序文件)。

在cygwin下用flex,bison和gcc工具将实验调试通过,并且你写的语法分析器至少应该能通过例子parser1中testcases目录下的test0.p和test1.p两个测试例。

四.实验过程及重点内容

实验5:

首先复制一份实验2的LEX词法分析.l文件

根据实验2的语言文法 删去不需要的词法终结符与正规式

并添加 := ASSIGN : COLON等等新增的终结符

image-20230613212838643

去掉为每个记号手动编写的define编号 因为yacc会自动生成头文件 其中包含了每个记号的编号

由于需要储存多种类型的值 则需要定义联合体

image-20230613213355341

image-20230613213437637

声明所有的终结符:

image-20230613213555469

改写实验2的文法为代码:

image-20230509214840854

image-20230509214853617

挨个为每个语法规则编写yacc代码:

如果直接按照实验文档的文法 将出现移进-归约冲突 故对变量解释及变量解释表产生式进行了更改

image-20230614001646476

使用yacc与flex进行编译链接

image-20230614205753371

运行测试用例test0/1.p

image-20230614205841463 image-20230614205817510

实验6:

首先需要修改.l文件

对于in int float需要进行赋值操作

image-20230616011758323

image-20230616011835129

复制一份parser1已提供的文件

主要需要修改ast.c parser.y

ast.h提供了很多的数据结构 需要慢慢细看 先直接修改ast.c文件中的函数

image-20230616012024358

观察Int赋值格式 先去查询a_exp数据结构 发现需要固定赋值一个kind和用于报错的pos

其他函数类似 根据函数的名称以及返回值类型 前去ast.h查询数据结构

然后根据功能对结构体中的每个变量来进行赋值

image-20230616012127853 image-20230616012242489

修改完毕ast.c中的各函数后 回到.y文件中

将实验5中已经定义的语言复制一份过来

image-20230616012444256

现在需要在分析文法的同时,加上函数动作

预先定义三个主要结构的指针 程序/变量说明表/语句表

image-20230616012603631

为大部分产生式添加动作

其中$$代表非终结符本身 $i代表第i个记号的值

根据每个子函数所需要的参数进行填写 以及对返回值进行赋值

image-20230616012715905

image-20230616012838569

在添加动作时 发现非终结符出现报错 原因是没有对非终结符进行类型的指定

更改union集合体的类型

image-20230616013029412

并为每个非终结符进行类型指定

image-20230616013050968

动作指定完毕后,即可通过make指令进行链接编译

image-20230616011601399

五.实验结果

实验5:

image-20230614205841463 image-20230614205817510

实验6:

test0.p

image-20230616011601399

test1.p

image-20230616011629244

image-20230616011641076

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RISCV Reader笔记_2 RV32I

RV32I 完整的RV32I指令集可以用下面的式子中出现单词的首字母表示: 比如这一条: set less than {immediate} {unsigned} 也就是slt slti sltu sltiu这4个指令。 RISCV指令格式如下。R 寄存器操作,I 立即数或load访存,S store访…

C51单片机期末复习第八章单片机接口技术

一 总线: 传送同类信息的连线 三总线: 地址总线AB,数据总线DB,控制总线CB 目录(ppt给的没啥用,乱还不全): 8.1 单片机的系统总线 8.2 简单并行I/O口扩展 8.3 可编程并行I/O口扩展 8.4 D/A转换与DAC0832应用 8…

稀疏表:最大公约数

问题描述 给定一个数组, 每次操作可以选择数组中任意两个相邻的元素 x , y x, y x,y 并将其 中的一个元素替换为 gcd ⁡ ( x , y ) \operatorname{gcd}(x, y) gcd(x,y), 其中 gcd ⁡ ( x , y ) \operatorname{gcd}(x, y) gcd(x,y) 表示 x x x 和 y y y 的最大公约数。 请…

MIT 6.S081 教材第五章内容 -- 中断与设备驱动--下

MIT 6.S081 教材第五章内容 -- 中断与设备驱动--下 引言关于RISC-V特权级架构说明RISC-V特权模式OpenSBI介绍RISC-V启动过程RISC-V中的异常M模式下的异常1. 硬件中断的处理(以时钟中断为例)2. M模式下的异常相关寄存器3. 同步异常的处理 S模式下的异常1.…

chatgpt赋能python:Python散点图介绍:如何用Python绘制散点图?

Python散点图介绍:如何用Python绘制散点图? Python是一门流行的编程语言,用于解决各种问题和编写各种应用程序。其中,数据可视化是Python应用程序中非常重要的组成部分。散点图是最常用的数据可视化图形之一,它能够清…

拓扑排序:神经网络

题目链接 神经网络 题目大意 在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经 元之间至多有一条边相连,下图是一个神经元的例子: 图中, X 1 — X 3 X_1—X_3 X1​—X3​是信…

从类加载到双亲委派:深入解析类加载机制与 ClassLoader

目录 前言Class 文件介绍如何生成 class 文件观察 Bytecode 方法class 文件到底是什么样的呢? Class 加载、链接、初始化加载、类加载器双亲委派Launcher 核心类ClassLoader 相关源码ClassLoader 相关问题自定义简单 ClassLoader自定义加密 ClassLoader打破双亲委派…

动态ip与静态ip的概念、区别、应用场景

动态ip与静态ip的区别 前言一、介绍IP地址的概念和作用1.1、IP地址的定义1.2、IP地址的作用 二、动态IP和静态IP的区别2.1、动态IP和静态IP的定义2.2、动态IP和静态IP的特点2.3、动态IP和静态IP的优缺点比较 三、动态IP和静态IP的应用场景3.1. 动态IP的应用场景3.2. 静态IP的应…

利用numpy解决解方程组的基本问题

1 问题 进入大学,我们接触了线性代数,利用线性代数解方程组比高中慢慢计算会好了许多,快捷许多,我们作为编程人员,有没有用python解决解方程组的办法呢? 2 方法 我们提出使用python的numpy解方程。 找到用于…

11- C程序的组成结构 (C语言)

一、C程序的基本组成结构 1、源文件: 后缀为.c 的文件2、头文件:后缀为.h的文件 注意: 源文件 功能:实现程序功能头文件 功能:函数的声明、全局变量的声明、宏定义、类型的声明一个由C语言所组成的项目中 只允许有一个main函数 …

离散数学大作业任务书

目 录 实际的练习题目、系统的总功能和各子模块的功能………………………………………………………………………………1 1.1题目及问题描述………………………………………………………………1 1.2功能概述………………………………………………………………………1 1.3技…

02 | 日志系统:一条SQL更新语句是如何执行的?

以下内容出自《MySQL 实战 45 讲》 02 | 日志系统:一条SQL更新语句是如何执行的? 查询语句的那套流程,更新语句也会走一遍。 更新流程中和查询不一样的是,更新流程中涉及了两个重要的日志模块。redo log (重做日志) 和 binglog&a…

如何编写用于Neo-Hookean材料的Abaqus VUMAT Fortran子例程

引言 大家好,我是一个热爱编程、研究有限元分析的普通程序员。我非常感谢你们能够抽出宝贵的时间来阅读我的文章,你们的支持是我前行的动力。今天,我们将讨论一个非常专业的话题,即如何编写用于Neo-Hookean材料的Abaqus VUMAT Fo…

Unreal 5 实现UI制作

这一篇讲解一下unreal engine里面的内置ui插件UMG,虚幻示意图形界面设计器(Unreal Motion Graphics UI Designer)(UMG) 是虚幻引擎内置的一套ui制作工具,通过它我们能够实现平面ui,场景hud内容 实现背景图片填充整个…

【MySQL数据管理】:插入、修改、删除操作

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL数据插入、修改、删除的讲解✨ 目录 前言一、插入数据二、修改数据三、删除数据四、总结 一、插入数据 使用INSERT INTO语句来向表中插入数据 ✨语法: 给指定字段添加数据 INSERT INTO 表名 (字段…

ctfshow web入门 php特性web98-102

1.web98 get会被post方式覆盖,传入的参数需要等于flag,才能读取到flag值,如果直接传http_flagflag,返回的结果会是一个空数组,因为get变量被覆盖了,而post没有传参 payload: get 11 post HTTP_FLAGflag 2.web99 array_push在数组…

机器视觉初步8:特征提取专题

文章目录 1.角点检测2.纹理特征提取3.特征描述符匹配3.1 Harris角点描述符3.2 SIFT(尺度不变特征变换)描述符3.3 SURF(加速稳健特征)描述符 4.基于深度学习的特征提取 在机器视觉中,特征提取是从目标图像中提取有用的视…

C语言:打印菱形(输入菱形上半部分行数)

题目: 用C语言在屏幕上输入以下图案: 思路: 总体思路: (一). 输入菱形上半部分行数 -- scanf()函数 (二). 使用 for循环 进行 菱形上半部分三角形 的打印, 菱形上半部分…

基于5G网络的视频远程操控应用实践——低延迟视频技术及应用

本次分享将分为三个部分:第一部分介绍低延迟视频所涉及到的关键技术,包括低延迟视频编解码、视频传输、视频处理低延时框架、视频采集和显示;第二部分重点介绍5G环境下低延迟视频对抗弱网提出的要求,包括:弱网状态的探…

Vulcanexus-一体化ROS2工具集

Vulcanexus机器人操作系统ROS2一站式工具集(GalacticHumble)2022 Humble Hierro v2 x86_64 arm64 Ubuntu Jammy (22.04) Vulcanexus是ROS 2的一站式工具集,用于构建机器人应用程序。它固定了DDS中间件,使用了Fast DDS&#xff…