2024秋中间代码生成作业-B (满分25分)

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

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

【问题描述】

语法分析作业中选B的同学完成本作业,需要在第二次作业的基础上完成。

本次作业将Block语言翻译成三地址代码,Block中包含变量声明、赋值语句、if语句、while语句、输入输出语句

文法和语法分析作业B中相同

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

请在LR语法分析程序的基础上添加相应的语义动作,完成三地址代码的翻译。输入输出及处理要求如下:

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

(2)本项作业第2次作业的基础上进行;

(3)属性文法请自行设计;

(4)printf语句按照函数调用生成三地址代码,即param arg1; param arg2; param arg3; call func n;其中n为参数个数。和作业A不同,作业B的printf文法允许输出多个整数。

(5)对于输入语句a=getint();测试程序要求翻译成a=getint()

(6)最后需额外添加一条停语句,即halt,参见样例

(7)为了方便进行自动评测,输入的被编译源文件统一命名为testfile.txt(注意不要写错文件名);输出的结果文件统一命名为output.txt(注意不要写错文件名);结果文件中三地址代码的编号从0开始,输出时编号后面有冒号以及\t制表符

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

【输出形式】按如上要求将三地址代码结果输出至output.txt中。

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

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

           (3)请自行设计三地址代码的内部存储形式,注意它并非一个简单的字符串,否则后续目标代码生成阶段会比较麻烦。

【样例输入】

{
	//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");
	}
}

【样例输出】

0:	x=10
1:	y=20
2:	param "x=%d,y=%d\n"
3:	param x
4:	param y
5:	call printf,3
6:	if x<y goto 8
7:	goto 11
8:	param "x<y\n"
9:	call printf,1
10:	goto 13
11:	param "x>y\n"
12:	call printf,1
13:	halt</span></span></span>

【评分标准】

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

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

【参考代码】本次作业不提供参考代码

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

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

答案:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值