2024秋语法分析作业-B(满分25分)

特别注意:第17条产生式改为

17) Stmt → 'while' '(' Cond ')' Stmt

【问题描述】

本次作业只测试一个含简单变量声明、赋值语句、输出语句、if语句和while语句的文法:

0)  CompUnit → Block

1)  Block → '{' BlockItemList '}'

2)  BlockItemList →  BlockItemList BlockItem 

3)  BlockItemList →  EPSILON

4)  BlockItem → VarDecl

5)  BlockItem → Stmt

6)  VarDecl → 'int' VarDeclList ';' 

7)  VarDeclList → VarDeclList  ',' VarDef

8)  VarDeclList → VarDef

9)  VarDef → Ident

10) VarDef → Ident '=' Exp

11) Stmt → Ident '=' Exp ';' 

12) Stmt → Exp ';'

13) Stmt → ';'

14) Stmt → Block

15) Stmt → 'if' '(' Cond ')' Block

16) Stmt → 'if' '(' Cond ')' Block 'else' Block

17) Stmt → 'while' '(' Cond ')' Stmt

18) Stmt → Ident '=' 'getint''('')'';'

19) Stmt → 'printf''('FormatString ExpList ')'';' 

20) ExpList → ExpList ',' Exp

21) ExpList → EPSILON

22) Exp → AddExp 

23) Cond → LOrExp 

24) PrimaryExp → '(' Exp ')'

25) PrimaryExp → Ident

26) PrimaryExp → IntConst 

27) UnaryExp → PrimaryExp

28) MulExp → UnaryExp 

29) MulExp → MulExp '*' UnaryExp

30) MulExp → MulExp '/' UnaryExp 

31) MulExp → MulExp '%' UnaryExp 

32) AddExp → MulExp

33) AddExp → AddExp '+' MulExp

34) AddExp → AddExp '-' MulExp 

35) RelExp → AddExp

36) RelExp → RelExp '<' AddExp

37) RelExp → RelExp '>' AddExp 

38) RelExp → RelExp '<=' AddExp 

39) RelExp → RelExp '>=' AddExp  

40) EqExp → RelExp

41) EqExp → EqExp '==' RelExp 

42) EqExp → EqExp '!=' RelExp 

43) LAndExp → EqExp

44) LAndExp → LAndExp '&&' EqExp 

45) LOrExp → LAndExp

46) LOrExp → LOrExp '||' LAndExp

其对应的LR1分析表共含有170个状态。

请根据该文法设计并实现LR语法分析程序,能基于上次作业的词法分析程序所识别出的单词,识别出各类语法成分。输入输出及处理要求如下:

(1)需按文法规则,用LR分析法法对文法中定义的语法成分进行分析(需要使用上次作业中的词法分析程序);

(2)本项作业对应的文法已经在参考代码CFGBlock.java中实现。当然你也可以重新设计文法的数据结构

(3)本项作业需要根据所学知识自动生成LR1分析表,参考代码中给出了分析表的数据结构,你也可以自行设计。

(4)为了方便进行自动评测,输入的被编译源文件统一命名为testfile.txt(注意不要写错文件名);输出的结果文件统一命名为output.txt(注意不要写错文件名);结果文件中包含如下两种信息:

    1)按词法分析识别单词的顺序,按行输出每个单词的信息(要求同词法分析作业,对于预读的情况不能输出)。

    2)在文法中出现的语法分析成分分析结束前,另起一行输出当前语法成分的名字,形如“<AddExp>”

【输入形式】testfile.txt中的符合文法要求的测试程序。

【输出形式】按如上要求将语法分析结果输出至output.txt中。

【特别提醒】(1)本次作业只考核对正确程序的处理,但需要为今后可能出现的错误情况预留接口。

           (2)当前要求的输出只是为了便于评测,完成编译器中无需出现这些信息,请设计为方便打开/关闭这些输出的方案。

【样例输入】

{
	//simple test
	x=10;
	y=20;
	printf("x=%d,y=%d\n",x,y);
	if(x<y){
		printf("x<y\n");
	}else{
		printf("x>y\n");
	}
}

【样例输出】

LBRACE {

<BlockItemList>

IDENFR x

ASSIGN =

INTCON 10

<PrimaryExp>

<UnaryExp>

<MulExp>

<AddExp>

<Exp>

SEMICN ;

<Stmt>

<BlockItem>

<BlockItemList>

IDENFR y

ASSIGN =

INTCON 20

<PrimaryExp>

<UnaryExp>

<MulExp>

<AddExp>

<Exp>

SEMICN ;

<Stmt>

<BlockItem>

<BlockItemList>

PRINTFTK printf

LPARENT (

STRCON "x=%d,y=%d\n"

<ExpList>

COMMA ,

IDENFR x

<PrimaryExp>

<UnaryExp>

<MulExp>

<AddExp>

<Exp>

<ExpList>

COMMA ,

IDENFR y

<PrimaryExp>

<UnaryExp>

<MulExp>

<AddExp>

<Exp>

<ExpList>

RPARENT )

SEMICN ;

<Stmt>

<BlockItem>

<BlockItemList>

IFTK if

LPARENT (

IDENFR x

<PrimaryExp>

<UnaryExp>

<MulExp>

<AddExp>

<RelExp>

LSS <

IDENFR y

<PrimaryExp>

<UnaryExp>

<MulExp>

<AddExp>

<RelExp>

<EqExp>

<LAndExp>

<LOrExp>

<Cond>

RPARENT )

LBRACE {

<BlockItemList>

PRINTFTK printf

LPARENT (

STRCON "x<y\n"

<ExpList>

RPARENT )

SEMICN ;

<Stmt>

<BlockItem>

<BlockItemList>

RBRACE }

<Block>

ELSETK else

LBRACE {

<BlockItemList>

PRINTFTK printf

LPARENT (

STRCON "x>y\n"

<ExpList>

RPARENT )

SEMICN ;

<Stmt>

<BlockItem>

<BlockItemList>

RBRACE }

<Block>

<Stmt>

<BlockItem>

<BlockItemList>

RBRACE }

<Block>

<CompUnit>

【评分标准】

按与预期结果不一致的行数扣分,每项扣5%。

【开发语言及环境】用 C/C++/JAVA 实现,平台支持 C++11 标准。评测机所采用的编译学生代码的版本是:C/C++ gcc 8.1.0,Java jdk 1.8。

【参考代码】参考代

src.rar中给出了文法和LR分析表的定义,你需要自行设计LR分析程序

【文档要求】完成2023语法分析阶段设计文档 (可在词法分析阶段设计文档基础上扩充完成)

【提交形式】将所开发的语法分析程序的源文件(.cpp/.c/.h/.java,不含工程文件)打包为zip或rar后提交。对于使用 java 开发的编译器,程序运行的入口为 src 目录下 Compiler.java 中的 main 方法。上传请直接打包 src 文件夹,如果引用了第三方外部包(推荐),请将外部 jar 包文件放到 bin 目录下,bin 和 src 两个文件夹同级,将 bin 和 src 一起打包后提交即可。注意 mac 压缩会产生额外的文件到压缩包中,需删掉额外文件后提交。

答案:

Mag1skY/Compiler-Principles: 词法分析 语法分析 中间代码生成 代码生成

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL-leetcode-197. 上升的温度

197. 上升的温度 表&#xff1a; Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是该表具有唯一值的列。 没有具有相同 recordDate 的不同行。 该表包…

C#编写的金鱼趣味小应用 - 开源研究系列文章

今天逛网&#xff0c;在GitHub中文网上发现一个源码&#xff0c;里面有这个金鱼小应用&#xff0c;于是就下载下来&#xff0c;根据自己的C#架构模板进行了更改&#xff0c;最终形成了这个例子。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b; 1) 初始化&#xff1b; 将样…

通过无障碍服务(AccessibilityService)实现Android设备全局水印显示

一、无障碍功能简介 首先我们先来了解下无障碍功能的官方介绍&#xff1a; 无障碍服务仅应用于帮助残障用户使用 Android 设备和应用。它们在后台运行&#xff0c;并在触发 AccessibilityEvents 时接收系统的回调。此类事件表示用户界面中的某些状态转换&#xff0c;例如焦点已…

【Blackbox Exporter】prober.Handler源码详细分析

http.HandleFunc(path.Join(*routePrefix, "/probe"), func(w http.ResponseWriter, r *http.Request) {sc.Lock()conf : sc.Csc.Unlock()prober.Handler(w, r, conf, logger, rh, *timeoutOffset, nil, moduleUnknownCounter, allowedLevel)})我们了解到blackbox_ex…

SpringMVC核心、两种视图解析方法、过滤器拦截器 “ / “ 的意义

SpringMVC的执行流程 1. Spring MVC 的视图解析机制 Spring MVC 的核心职责之一是将数据绑定到视图并呈现给用户。它通过 视图解析器&#xff08;View Resolver&#xff09; 来将逻辑视图名称解析为具体的视图文件&#xff08;如 HTML、JSP&#xff09;。 核心流程 Controlle…

基于动力学的MPC控制器设计盲点解析

文章目录 Apollo MPC控制器的设计架构误差模型和离散化预测模型推导目标函数和约束设计优化求解优化OSQP求解器参考文献 Apollo MPC控制器的设计架构 误差模型和离散化 状态变量和控制变量 1、Apollo MPC控制器中状态变量主要有如下6个 matrix_state_ Matrix::Zero(basic_stat…

DC-DC 降压转换器设计提示和技巧

基本 DC-DC 降压转换器电路 在开始之前&#xff0c;我们先回顾一下DC-DC降压转换器的电路&#xff1a; 为了帮助您&#xff0c;我开发了降压设计中“什么影响什么”的矩阵&#xff1a; 主要的权衡是电感&#xff08;与 k 因子成反比&#xff0c;即峰峰值与平均电感电流之比&a…

Unity3D仿星露谷物语开发9之创建农场Scene

1、目标 绘制农场的场景。通过不同Sorting Layer控制物体的显示优先级&#xff0c;绘制Tilemap地图&#xff0c;添加Tilemap Collider碰撞器&#xff0c;同时添加Composite Collider碰撞器优化性能。 ps&#xff1a;绘制Tilemap的技巧&#xff1a;通过"Shift [" 可…

Linux 定时任务:轻松创建与精准执行

Linux 定时任务&#xff1a;轻松创建与精准执行 在 Linux 系统的运维与自动化管理领域&#xff0c;定时任务扮演着举足轻重的角色。它能够让系统在预设的时间点或周期性时段&#xff0c;自动执行特定的脚本、命令&#xff0c;极大地减轻了管理员的工作负担&#xff0c;提升工作…

Linux驱动开发:深入理解I2C时序(二)

在Linux驱动开发中,I2C时序的理解和正确处理是保证I2C设备正常工作和通信的关键。I2C协议的时序特性决定了数据的有效传输和设备间的协作。因此,掌握I2C的时序细节,以及如何在Linux内核中进行时序处理,能够让开发者更好地处理设备通信问题。 本文将继续深入探讨I2C通信协议…

国产编辑器EverEdit - 常用资源汇总

1 国产编辑器EverEdit-常用资源汇总 EverEdit是一款国产文本编辑器&#xff0c;历经超过15年的更新和维护&#xff0c;拥有不输业界顶级商业文本编辑器(EmEditor、UltraEdit)的实力&#xff0c;甚至在某些方面的功能更强(当然&#xff0c;各有千秋)&#xff0c;开发者对文本编辑…

解决uniapp H5页面限制输入框只能输数字问题

工作记录 最最近在做 uniapp 开发的移动端 H5 页面&#xff0c;有个需求是金额输入框只能输入数字&#xff0c;不能输入小数点和其他字符&#xff0c;经过各种尝试&#xff0c;发现其他字符可以通过正则过滤掉&#xff0c;但是输入小数点的话&#xff0c;因为没有触发 input 和…

面试准备备备备

职业技能 放到简历的黄金位置&#xff08;HR刷选简历的重要参考&#xff09; 基本准则&#xff1a;写在简历上的必须能聊&#xff0c;不然就别写 参考公式&#xff1a;职业技能 必要技术 其他技术 针对性的引导面试官&#xff08;让他问一些你想让他问的&#xff09; 寻找合…

npm install --global windows-build-tools --save 失败

注意以下点 为啥下载windows-build-tools&#xff0c;是因为node-sass4.14.1 一直下载不成功&#xff0c;提示python2 没有安装&#xff0c;最终要安装这个&#xff0c;但是安装这个又失败&#xff0c;主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …

Jenkins 中自动化部署 Spring Boot 项目

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

【DSP/matlab】fftshift 是什么意思?在信号处理中有什么作用?

文章目录 前言一、定义什么是 fftshift&#xff1f;fftshift 在信号处理中的作用&#xff1a; 前言 dsp_paper 一、定义 fftshift 是一个在信号处理和数字信号处理中常用的函数&#xff0c;特别是在使用快速傅里叶变换&#xff08;FFT&#xff09;时。这个函数的主要作用是将…

【PCIe 总线及设备入门学习专栏 4.2 -- PCI 总线的三种传输模式 】

文章目录 OverviewProgrammed I/O&#xff08;PIO&#xff09;Direct Memory Access (DMA)Peer-to-Peer 本文转自&#xff1a;https://blog.chinaaet.com/justlxy/p/5100053095 Overview 本文来简单地介绍一下PCI Spec规定的三种数据传输模型&#xff1a;Programmed I/O&…

SpringBoot_第二天

SpringBoot_第二天 学习目标 Mybatis整合&数据访问 使用SpringBoot开发企业项目时&#xff0c;持久层数据访问是前端页面数据展示的基础&#xff0c;SpringBoot支持市面上常见的关系库产品(Oracle,Mysql,SqlServer,DB2等)对应的相关持久层框架&#xff0c;当然除了对于关系…

分类模型评估利器-混淆矩阵

相关文章 地理时空动态模拟工具介绍&#xff08;上&#xff09; 地理时空动态模拟工具介绍&#xff08;下&#xff09;地理时空动态模拟工具的使用方法 前言 混淆矩阵&#xff08;Confusion Matrix&#xff09;是机器学习领域中用于评估分类模型性能的一种工具。它通过矩阵的…

【SpringMVC】拦截器

拦截器&#xff08;Interceptor&#xff09;是一种用于动态拦截方法调用的机制。在 Spring MVC 中&#xff0c;拦截器能够动态地拦截控制器方法的执行过程。以下是请求发送与接收的基本流程&#xff1a; 当浏览器发出请求时&#xff0c;请求首先到达 Tomcat 服务器。Tomcat 根…