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

news2025/1/5 17:25:57

特别注意:第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: 词法分析 语法分析 中间代码生成 代码生成

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

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

相关文章

Tomcat优化指南

以下是一份详细的Tomcat优化指南&#xff1a; 一、JVM&#xff08;Java虚拟机&#xff09;优化 内存设置 堆内存&#xff08;Heap Memory&#xff09; 调整-Xms&#xff08;初始堆大小&#xff09;和-Xmx&#xff08;最大堆大小&#xff09;参数。一般来说&#xff0c;将初始…

【我的 PWN 学习手札】IO_FILE 之 劫持vtable

vtable帮助C实现了类似于多态的效果&#xff0c;然而其中的大量函数指针&#xff0c;一旦被劫持修改&#xff0c;就会产生巨大的危害。 前言 【我的 PWN 学习手札】IO_FILE相关几个基本函数的调用链源码-CSDN博客 【我的 PWN 学习手札】IO_FILE 之 stdin任意地址写-CSDN博客…

力扣编程从0-1

第一题 class Solution:def mergeAlternately(self, word1: str, word2: str) -> str:#计算两个字符串长度&#xff0c;从i 0开始遍历&#xff0c;每次循环&#xff1a;#如果i小于word1的长度&#xff0c;把word1[i]加到答案末尾#如果i小于word2的长度&#xff0c;把word2[…

SpringMVC(一)配置

目录 引入 第一章&#xff1a;Java web的发展历史 一、Model I和Model II 1.Model I开发模式 2.Model II开发模式 二. MVC模式 第二章&#xff1a;SpringMVC的入门案例 搭建SpringMVC的入门程序 1.创建新项目 2.等待加载导入坐标 3.处理xml文件和其他 导入tomcat 运…

迅为RK3568开发板编译Android12源码包-设置屏幕配置

在源码编译之前首先要确定自己想要使用的屏幕并修改源码&#xff0c;在编译镜像&#xff0c;烧写镜像。如下图所示&#xff1a; 第一步&#xff1a;确定要使用的屏幕种类&#xff0c;屏幕种类选择如下所示&#xff1a; iTOP-3568 开发板支持以下种类屏幕&#xff1a; 迅为 LV…

机器学习-感知机-神经网络-激活函数-正反向传播-梯度消失-dropout

文章目录 感知机工作流程 神经网络区别各种各样的神经网络 激活函数激活函数类型Sigmoid 函数ReLU函数Leaky ReLU 函数Tanh 函数 正向传播反向传播梯度消失(gradient vanish)如何解决 Dropout使用 PyTorch实战神经网络算法(手写MNIST数字识别)viewsoftmax和log-softmaxcross-en…

Android使用JAVA调用JNI原生C++方法

1.native-lib.cpp为要生成so库的源码文件 2.JNI函数声明说明 NewStringUTF函数会返回jstring JNI函数声明规则 3.JAVA中声明及调用JNI函数 声明&#xff1a; 调用 4.源码地址&#xff1a; gitgithub.com:tonyimax/UpdateTimeByThread.git

【git】git stash相关指令

目录 git stashgit stash save “”git stash list&#xff1a; 获取stash列表git stash pop&#xff1a;恢复最近一次stash缓存git stash apply stash{index}: 恢复指定缓存在这里插入图片描述git stash drop stash{1}&#xff1a;删除指定缓存 git stash clear :删除stash gi…

spring的@Transactional事务原理理解

目录 Transactional 普通例子代码和测试输出编程式事务事务代理实现和TransactionAspectSupport重要类复习Spring的事务传播机制有哪些实际工作中用到的事务处理 Transactional事务原理理解 Transactional 普通例子代码和测试输出 Transactional(rollbackFor Exception.class…

WebGL之Tree.js

tree基于WebGL的库绘制展示3D图形使用场景包括: 网页游&#xff1a;创建交互式的3D游戏&#xff0c;提供沉浸式的游戏体验。数据可视&#xff1a;将复杂的数据以3D形式展示&#xff0c;便于用户理解和分析。产品展&#xff1a;在电商网站上展示产品的3D模型&#xff0c;提供更…

图像识别-全连接层-卷积层-卷积层的计算-多输入通道场景-多输出通道场景-感受野-填充-VALID 与 SAME-stride-池化-CNN架构

文章目录 全连接层卷积神经网络的作用全连接层的问题场景图像处理和数据转换信息丢失的实例特征提取阶段分类阶段 卷积层卷积层的计算多输入通道场景多输出通道场景批量操作 感受野填充&#xff08;padding&#xff09;VALID 与 SAMEstride池化池化的作用 CNN架构 全连接层 卷…

MATLAB 车牌自动识别系统设计 SVM支持向量机方法 车牌识别

基于支持向量机&#xff08;SVM&#xff09;方法的车牌自动识别系统是一种利用SVM算法对车牌进行分类和识别的技术。该系统通过将车牌的图像处理和特征提取与SVM分类相结合&#xff0c;实现车牌的自动检测与识别。 1. 系统概述 车牌自动识别系统旨在从车辆图像中自动识别车牌…

《Vue3实战教程》39:Vue3无障碍访问

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 无障碍访问​ Web 无障碍访问 (也称为 a11y) 是指创建可供任何人使用的网站的做法——无论是身患某种障碍、通过慢速的网络连接访问、使用老旧或损坏的硬件&#xff0c;还是仅处于某种不方便的环境。例如&#xff0c;…

C++ 【回调函数】详解与代码解读

在现代软件开发中&#xff0c;回调函数是一个常用的工具&#xff0c;能够实现函数调用的延迟绑定&#xff0c;广泛应用于事件驱动、异步操作以及模块解耦等场景。本文将从基础概念、分类、实现方式到代码示例&#xff0c;全面讲解 C 回调函数的实现和应用。 什么是回调函数&…

No.1十六届蓝桥杯备战|第一个C++程序|cin和cout|命名空间

第一个C程序 基础程序 使用DevC5.4.0 写一个C程序 在屏幕上打印hello world #include <iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } 运行这个C程序 F9->编译 F10->运行 F11->编译运行 mai…

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习

文章目录 Section 4&#xff1a;The Vim Help System&#xff08;Vim 帮助系统&#xff09;S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…

印象笔记07——试一试PDF标注

印象笔记07——试一试PDF标注 [!CAUTION] 根据第六期&#xff0c;我再次查询了资料&#xff0c;印象笔记还是有一些可圈可点的功能的&#xff08;当然部分有平替&#xff09;&#xff0c;针对会员作用&#xff0c;开发使用场景虽然是逆向的&#xff0c;但我坚信这是一部分人的现…

JDK17源码分析Jdk动态代理底层原理

本文侧重分析JDK17中jdk动态代理的源码&#xff0c;若是想看JDK8源码分析可以看我的这一篇文章 JDK8源码分析Jdk动态代理底层原理-CSDN博客 两者之间有着略微的差别&#xff0c;JDK17在JDK8上改进了不少 目录 JDK 17的动态代理源码 核心入口方法 newProxyInstance 获取代理类…

【网络协议】开放式最短路径优先协议OSPF详解(一)

OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议&#xff0c;它通过使用区域划分以实现更好的可扩展性。 文章目录 链路状态路由协议OSPF 的工作原理OSPF 数据包类型Dijkstra算法、管理距离与度量值OSPF的管理距离OSPF的度量值 链路状态路由协议的优势拓扑结构路由器O…

vim 的基础使用

目录 一&#xff1a;vim 介绍二&#xff1a;vim 特点三&#xff1a;vim 配置四&#xff1a;vim 使用1、vim 语法格式2、vim 普通模式&#xff08;1&#xff09;保存退出&#xff08;2&#xff09;光标跳转&#xff08;3&#xff09;文本删除&#xff08;4&#xff09;文本查找&…