当前位置: 首页 > news >正文

燕山大学编译原理-(实验1 词法分析、实验2 自顶向下的语法分析程序、实验3 基于 LR(0)方法的语法分析、 实验4 语义分析和中间代码生成)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验1 词法分析

1.1实验目的

(1)理解有穷自动机及其应用
(2)掌握 NFA 到 DFA 的等价变换方法、DFA 最小化的方法
(3)掌握设计、编码、调试词法分析程序的技术和方法

1.2 实验任务

编写一个程序对输入的源代码进行词法分析,并打印分析结果。借助词法分析工具 GNU Flex,编写一个对使用 C--语言书写的源代码进行词法分析 (C--语言的文法参见附录 A),并使用 C 语言完成。

1.3 实验内容

1.3.1实验要求

你的程序要能够查出源代码中可能包含的词法错误: 词法错误(错误类型 A):(以输入 C--源代码为例)即出现 C--词法中未定义的字符 以及任何不符合 C--词法单元定义的字符

1.3.2 输入格式

程序的输入是一个包含 C--源代码的文本文件,程 序需要能够接收一个输入文件名作为参数。例如,假设你的程序名为 cc、输入文件名为 test1、 程序和输入文件都位于当前目录下,那么在 Linux 命令行下运行./cc test1 即可获得以 test1 作为输入文件的输出结果。

实验2 自顶向下的语法分析程序

2.1 实验目的

(1)熟练掌握 LL(1)分析表的构造方法。
(2)掌握设计、编制和调试典型的语法分析程序,进一步掌握常用的语法分析方法。

2.2 实验任务

根据 LL(1)分析法自己编写一个语法分析程序,语言不限,文法不限。

2.3 实验内容

2.3.1 实验要求

你的程序应具有通用性,能够识别由词法分析得出的词法单元序列是否是给定文法的正 确句子(程序),并能够输出分析过程和识别结果。

2.3.2 输入格式

1、一个包含源代码的文本文件,此时需要和词法分析程序进行对接,通过一次扫描同 时完成词法分析和语法分析;

实验3 基于 LR(0)方法的语法分析

3.1 实验目的

(1)掌握 LR(0)分析表的构造方法。
(2)掌握设计、编制和调试典型的语法分析程序,进一步掌握常用的语法分析方法。 (3)理解语法分析在编译程序中的作用。

3.2 实验任务

自己编写一个基于 LR(0)方法的语法分析程序。语言不限,文法不限。

3.3 实验内容

3.3.1 实验要求

你的程序应具有通用性,能够识别由词法分析得出的词法单元序列是否是给定 文法的正确句子(程序),并能够输出分析过程和识别结果。

3.3.2 输入格式

你的程序输入是一个包含待分析词法单元序列的文本 文件,程序需要能够接收一个输入文件名作为参数,以获得相应的输出结果。

3.3.3 输出格式

你的程序需要输出语法分析过程(包括 LR(0)分析表和分析过程表,并能够保 存 LR(0)分析表)和相应的分析结果(即此串是否为 LR(0)文法的句子)。

实验4 语义分析和中间代码生成

4.1 实验目的

(1)熟悉语义分析和中间代码生成过程。
(2)加深对语义翻译的理解。

4.2 实验任务

此次实验任务有两个:首先是语义分析任务,即在词法分析和语法分析程序的基础上编 写一个程序,对输入的源代码进行语义分析和类型检查,并打印分析结果;然后,在语义正确的基础上,实现一种中间代码的生成。

任务 1:审查每一个语法结构的静态语义,即验证语法正确的结构是否有意义。此部分 不再借助已有工具,需手写代码来完成。

任务 2:在词法分析、语法分析和语义分析程序的基础上,将输入源代码翻译成中间代 码。(A、B 任务二选一)

A) 将 C 源代码翻译为中间代码,理论上中间代码在编译器的内部表示可以选用树 形结构(抽象语法树)或者线形结构(三地址代码)等形式,为了方便检查你的程序,我 们要求将中间代码输出成线性结构,从而可以使用我们提供的虚拟机小程序(附录 B)来测 试中间代码的运行结果。
B) 编写一个中间代码生成程序,能将算术表达式等翻译成逆波兰、三元组或四元组形 式(选择其中一种形式即可)

在这里插入图片描述

相关文章:

  • 力扣(LeetCode)276. 栅栏涂色(2022.10.03)
  • Ubuntu系统安装
  • 牛客网专项练习30天Pytnon篇第04天
  • 【目标检测算法】IOU、GIOU、DIOU、CIOU与YOLOv5损失函数
  • 为什么梯度方向一定是函数增大的方向
  • Vue学习第36天——PC端和移动端常用的Vue UI组件库
  • ⌈Linux_ 感受系统美学⌋ 剖释Linux操作系统 | 底层级操作增进Linux内功
  • 数据结构之二叉树
  • 数组与数组名到底该如何理解?
  • 计算机网络——随机接入
  • 【NLP开发】Python实现聊天机器人(微软Azure机器人服务)
  • MyBatis框架总结
  • 10.3国庆作业(UART实验)
  • 西瓜书研读——第五章 神经网络:感知机与多层网络
  • Docker实战:Docker安装Gitlab实用教程
  • 2017 年终总结 —— 在路上
  • AWS实战 - 利用IAM对S3做访问控制
  • CEF与代理
  • Java,console输出实时的转向GUI textbox
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js学习笔记
  • SOFAMosn配置模型
  • SpringCloud集成分布式事务LCN (一)
  • ViewService——一种保证客户端与服务端同步的方法
  • 安装python包到指定虚拟环境
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 机器学习 vs. 深度学习
  • 聚簇索引和非聚簇索引
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 漂亮刷新控件-iOS
  • 深度学习中的信息论知识详解
  • 实现菜单下拉伸展折叠效果demo
  • 通过git安装npm私有模块
  • 我的zsh配置, 2019最新方案
  • 一道面试题引发的“血案”
  • 译自由幺半群
  • 在weex里面使用chart图表
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​第20课 在Android Native开发中加入新的C++类
  • #NOIP 2014# day.1 T2 联合权值
  • #QT(串口助手-界面)
  • (1)(1.13) SiK无线电高级配置(五)
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)JPA - JQPL 实现增删改查
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ***检测工具之RKHunter AIDE
  • 、写入Shellcode到注册表上线
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞