OUC编译原理实验报告 实验4:验证Yacc的使用/实验e4:从语言SUM到栈式计算机STACK的机器语言的翻译

news2024/11/24 4:05:54

编译原理实验报告

实验4:验证Yacc的使用

实验e4:从语言SUM到栈式计算机STACK的机器语言的翻译

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

目录

文章目录

  • 编译原理实验报告
  • 目录
    • 一.实验目的
    • 二.实验内容
        • 实验4
        • 实验e4
    • 三.实验要求
        • 实验4
        • 实验e4
    • 四.实验过程及重点内容
      • 实验4:
        • 二义性文法:
        • 非二义性文法:
      • 实验e4:
        • compile函数
        • print函数
        • 修改语法树为1+(2+3)
    • 五.实验结果
      • 实验4
      • 实验e4:

一.实验目的

实验4:

熟悉语法分析器生成工具Yacc的使用,并学会在实验环境下使用bison工具编译Yacc文法说明文件。学习如何使用lex和yacc合作进行语法分析。

实验e4:

熟悉语言SUM 到栈式计算机STACK的机器语言的翻译过程,理解编译的一般步骤。

二.实验内容

实验4

根据给出的calculator例子(calculator0,calculator1,calculator2,calculator3)

完成下面题目:用lex和yacc写一个计算布尔表达式真值的计算器。

实验e4

sum.c是用c语言写的从sum语言到栈式计算机STACK的机器语言的编译器(省略了词法语法分析部分)。

该程序的基本功能是先构造SUM语言的某句子的抽象语法树,然后将该语法树翻译成STACK的机器语言程序,并按顺序打印出该机器语言程序的指令。

程序中有两段内容不完整(在程序中用TODO表示),请读懂并编译通过该程序,再将TODO的部分补充完整,并编译通过。

三.实验要求

实验4

输入为一个布尔表达式,以换行结束。输出为这个布尔表达式的真值(true或false)。

尝试二义文法和非二义文法两种不同的实现方式。布尔表达式二义文法为:

S –> S or S |

S and S |

not S |

(S) |

true |

false,其中优先级or < and < not,or 和 and 左结合,not 右结合。

非二义文法请参照表达式非二义文法自己写出来。

在实验环境下用flex,bison和gcc工具将实验调试通过,并写出测试例测试正确性。

实验e4

  1. 读懂程序sum.c并编译通过。(该程序可以使用gcc编译通过,其他编译环境请自行调试)

  2. 用你自己写的程序段替换程序中的TODO部分,使程序功能与实验内容的描述一致。

  3. (此要求为额外要求,供学有余力的同学自行选择。)将程序的输入改为句子1+(2+3)的抽象语法树,尝试程序能否输出正确的结果。

四.实验过程及重点内容

实验4:

本实验需要编写两个文件 一个是词法分析器的lex文件 一个是语法分析的yacc文件

二义性文法:

lex需要用到的记号

image-20230525004943517

yacc:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CC1jnclr-1687580593336)(null)]

token定义了所有终结符

left和right定义了左右结合性 从上至下代表着优先级从低到高

image-20230525005141443

定义文法boool

$$代表左侧记号属性值 %i代表右侧第i个记号的属性值

根据布尔运算的定义 右侧用C语言计算属性值

阅读yacc使用指南 对.y和.l文件进行编译链接

image-20230525005509754

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9WVwLPzH-1687580524132)(null)]

在ERYI.l中加入头文件引用

image-20230525005530418

最后使用gcc编译器 生成e4.exe

测试结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UD5RRAlg-1687580524861)(null)]

与预期结果相等 括号也可正常识别

非二义性文法:

主要修改yacc文件中的文法

优先级从低到高
S->S or T | T
T->T and F | F
F->not F | (S) | false | true

image-20230525145053953

编译运行生成的exe文件 测试用例为:

true or not true and false
false or (not true and true)
false or not (true and false)
false or not true and false

结果符合预期输出:

image-20230525145229836

实验e4:

首先读懂main函数:

image-20230525153918045

由Exp_sum_new和exp_int_new构成了一棵加法的二叉树

Exp_print函数则是分析语法树,输出语法树对应的表达式是什么

image-20230525154014399

接下来由compile函数对二叉树进行后续遍历,如果是INT结点直接入栈

如果是SUM结点则继续遍历,并把ADD入栈

最后由List_reverse_print函数输出链表的结果

compile函数

image-20230525154302571

INT结点直接将值入栈

SUM结点继续递归后序遍历 并把ADD入栈

print函数

image-20230525154357409

先对list_new函数进行分析 由分析可知链表采用的是头插法

例如1+2 链表中储存的顺序由头节点开始应为 ADD->2->1

但实验要求翻转输出 函数名也对应为reverse_print

接下来对list链表进行逆序输出:

我采取的做法是将list再次使用头插法重新插入到一个新链表中 再次输出链表则为逆序

定义新结点类型:

image-20230525161134865

使用头插法把结点插入新链表中

image-20230525161148856

直接顺序遍历新链表:

image-20230525161220822

结果如下:

image-20230525161241889

修改语法树为1+(2+3)

image-20230525161520591

结果正常输出:

image-20230525161539164

五.实验结果

实验4

二义性文法:

image-20230525005616709

非二义性文法:

image-20230525145053953

实验e4:

image-20230525161241889

image-20230525161539164

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

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

相关文章

多进程爬虫实战-摩托车网

前言 最近有遇到很多私信让我讲一讲多进程的爬虫&#xff0c;我发现大家对爬虫的框架写法和进程的理解有很多的问题和疑问&#xff0c;这次就带来一个小实战让大家理解多进程爬虫以及框架的写法 由于进程爬虫会对任何服务器都有一定的影响&#xff0c;本文仅供学习交流使用&…

【Linux后端服务器开发】C程序预处理

目录 一、源文件到可执行程序的过程 二、预定义符号 三、#define宏定义 四、条件编译 一、源文件到可执行程序的过程 预处理&#xff1a;去注释&#xff0c;宏替换&#xff0c;头文件展开&#xff0c;条件编译编译&#xff1a;c语言 ---> 汇编语言&#xff08;语法分析…

JUC高级-0625

13. AbstractQueuedSynchronized之AQS 13.1 前置知识 公平锁和非公平锁可重入锁自旋思想LockSupport数据结构之双向链表设计模式之模板设计模式 13.2 AQS入门级别理论知识 AQS是什么&#xff1f; 字面意思&#xff1a;抽象的队列同步器&#xff0c;实现了通知唤醒的机制源代…

8通道250MSPS采样率16位AD采集FMC子卡-高速数据采集专家

FMC128是一款8通道250MHz采样率16位分辨率AD采集FMC子卡&#xff0c;符合VITA57.1规范&#xff0c;可以作为一个理想的IO模块耦合至FPGA前端&#xff0c;8通道AD将模拟信号数字化后通过高带宽的FMC连接器&#xff08;HPC&#xff09;连接至FPGA&#xff0c;从而大大降低了系统信…

电力智能运维是什么?有哪些优势?

设备检修维护是指对设备和系统进行必要的监视、维修和养护&#xff0c;通过日常的维护使设备保持良好的状态&#xff0c;确保设备安全、稳定、经济运行。由于时代的变迁&#xff0c;电力设备的检测维修变得也越来越智能化。采用的智能运维系统&#xff0c;可以更好的监控电力设…

BCSP-玄子Java开发之Java Web编程CH01_初识动态网页

BCSP-玄子Java开发之Java Web编程CH01_初识动态网页 1.1 B/S架构 B/S架构&#xff1a;浏览器/服务器 程序完全部署在服务器上使用浏览器访问服务器无需单独安装客户端软件 为什么要使用B/S架构 B/S与C/S比较B/S架构C/S架构软件安装浏览器需要专门的客户端应用升级维护客户…

NGINX PHP Cookie 会话中 PHPSESSID 缺少 HTTPOnly、Secure 属性解决方案

NGINX & PHP Cookie 会话中 PHPSESSID 缺少 HTTPOnly、Secure 属性解决方案 1 / 说明 基于安全的考虑&#xff0c;需要给cookie加上Secure和HttpOnly属性&#xff0c;HttpOnly比较好理解&#xff0c;设置HttpOnlytrue的cookie不能被js获取到&#xff0c;无法用document.coo…

linux系统的文件等相关操作命令

文章目录 1 查找文件&#xff08;find、grep&#xff09;2 查看文件内容&#xff08;cat、more、less、head、tail&#xff09;3 文件比较&#xff08;diff&#xff09;4 文本编辑器&#xff08;vi、vim&#xff09;5 文件压缩与解压&#xff08;tar、tar.tgz、zip、rar、rar.g…

yum安装 lnmp

目录 一.nginx 的yum安装 1.关闭防火墙 2. 安装 nginx 3.安装依赖包 4.启动服务 二. 安装 mysql 5.7 (mariadb) 1.nysal的yum安装 2. 启动服务 3.在日志文件中找出root用户的初始密码 4.登录 mysql 5. 停止版本更新&#xff0c;稳定数据库的运行 三.php 的yum安装 1.…

rust abc(4): 定义变量并使用 mut 关键字

文章目录 1. 目的2. 不可变变量 (immutable variable)2.1 含义2.2 代码实例 3. 可变变量 (mutable variable)3.1 含义3.2 代码实例 4. 总结 1. 目的 学习 rust 语言中变量的定义方式&#xff0c; 包括普通变量&#xff08;immutable&#xff09;、可变变量&#xff08;mutable…

轻量云服务器(香港)ping不通怎么解决?

​  在使用轻量云服务器(香港)时&#xff0c;有时候会出现ping不通的情况&#xff0c;这时候我们该怎么办呢? 首先&#xff0c;我们需要知道 ping 不通的原因。 ping 是一种基于 ICMP 协议的网络测试工具&#xff0c;它可以用来测试网络连接的质量和速度。如果 ping 不通&am…

英特尔进军晶圆代工,台积电“危”?

近来&#xff0c;半导体市场再次变得繁荣&#xff0c;尤其随着AI大型机模型的出现&#xff0c;半导体巨头们纷纷加大投资力度&#xff0c;以期在AI时代中积蓄新的增长。 作为AI大模型时代中最受益的厂商之一&#xff0c;英伟达稳居市场前沿&#xff0c;而AMD也加入了竞争&…

阿里发布2023年Java社招岗(正式版)面试题

每年的金三银四、金九银十都是各大公司招聘程序员的最佳时期&#xff0c;在这段时间内有好多程序员为面试而发愁&#xff0c;不知道如何才能收到好的 offer&#xff0c;拿到理想的薪资&#xff0c;实现自我的人生价值&#xff01; 我想告诉大家的是&#xff0c;其实都不用愁的…

Web Worker是什么?怎么用?

71. Web Worker是什么&#xff1f;怎么用&#xff1f; Web Worker 是一种浏览器提供的 JavaScript 特性&#xff0c;它允许在后台线程中运行脚本&#xff0c;从而避免阻塞主线程并提高页面性能和响应速度。 1. Web Worker 的使用方法如下&#xff1a; 创建 Worker 对象&…

chatgpt赋能python:Python编译成库的利与弊

Python编译成库的利与弊 Python作为一种高级编程语言&#xff0c;具有简洁易读的语法和强大的生态系统&#xff0c;在数据科学、Web开发、游戏开发等领域得到广泛应用。然而&#xff0c;Python解释器的执行效率较低&#xff0c;因此为了提高Python程序的性能&#xff0c;常使用…

【嵌入式环境下linux内核及驱动学习笔记-(18)内核驱动模块的启动机制】

目录 1、module_init宏1.1 展开1.2 解释以下几个标识1.2.1 fn1.2.2 id1.2.3 类型 initcall_t &#xff1a;1.2.4 __used1.2.5 __init1.2.6 __attribute__ 1.3 实例说明 2、 驱动启动机制2.1 initcall_t 类型的数组2.2.1 __initcallx_start数组2.2.2 initcall_levels[]数组 2.3 …

每日一练 | 华为认证真题练习Day64

1、如下图所示的网络&#xff0c;所有路由器运行0SPF协议&#xff0c;链路上方为Cost值的大小&#xff0c;则RA路由表中到达网络10.0.0.0/8的Cost值是多少&#xff1f; A. 70 B. 20 C. 60 D. 100 2、如下图所示的网络&#xff0c;主机A没有配置网关&#xff0c;主机B存在网关…

基于GEC6818 Qt智能病房监控系统

文章目录 一、项目设备及平台二、项目功能说明1. 整体功能2. GEC6818开发板功能介绍3. GY39模块功能介绍4. MQ-2型烟雾传感器功能介绍5. RFID模块 三、硬件系统设计实现与图表四、软件系统设计实现与流程图1. 软件系统设计总体描述2. 软件实现流程图3. 操作过程 五、调试过程中…

基于电容电流前馈与电网电压全前馈的单相LCL并网逆变器谐波抑制MATLAB仿真(电压比例反馈及一二次微分反馈)

基于电容电流前馈与电网电压全前馈的单相LCL并网逆变器谐波抑制MATLAB仿真&#xff08;电压比例反馈及一二次微分反馈&#xff09;资源-CSDN文库https://download.csdn.net/download/weixin_56691527/87941037模型简介&#xff1a; 参考阮新波教授【LCL型并网逆变器的控制技术…

scrapy的数据保存到数据库

将数据保存到数据库 mysql数据库 下载链接数据库的依赖 Conda/pip install pymysql在piplines.py 文件中 重写open_spider方法 ​ 连接到mysql数据库 def open_spider(self, spider):self.conn pymysql.Connect(hostlocalhost,port3306,userroot,password20020115,dbscrap…