基于扩展C0文法的编译器设计(Part1)

本文档详细介绍了基于扩展C0文法的编译器设计,涵盖了文法说明、目标代码解释及初步的优化方案。内容包括文法规则,如加法、乘法和关系运算符,标识符、数字和字符定义,以及程序结构。此外,还涉及到常量和变量声明,函数定义,以及表达式和语句的解析。目标代码以MIPS指令形式表示,并进行了窥孔优化和全局变量替换等基础优化。
摘要由CSDN通过智能技术生成

啊(充满哲♂学的呻吟)
终于在上学期完成了我航课程中的三巨头之一——编译,有了一点微不足道的收获。现在才有时间整理一下整个过程,发到博客上以记录自己的成果,顺便如果有学弟学妹需要也可以参考借鉴(但是别照搬——有查重!!

一.需求说明

1.文法说明

文法无需改写,符合要求,解读如下:
<加法运算符> ::= +|-
分析:定义加减法运算符
样例:a+b a-b
<乘法运算符> ::= *|/
分析:定义乘除法运算符
样例:a*b a/b
<关系运算符> ::= <|<=|>|>=|!=|==
分析:定义关系运算符小于,不大于,不小于,大于,不等于,等于
样例:a>b a<=b a!=b
<字母> ::= _|a|...|z|A|...|Z
分析:定义字母,是由下划线 _ 和26个字母的大小写组成的,不允许除此之外的其他字符
样例:_ a b z A B Z
<数字> ::= 0|<非零数字>
分析:定义数字的形式,0~9
样例:0 1 2 3 4 9
<非零数字> ::= 1|...|9
分析:定义非零数字,是1~9
样例:1 2 3 4 9

<字符> ::= ‘<加法运算符>’|’<乘法运算符>’|’<字母>’|’<数字>’
分析:定义字符的形式,它是被‘’包裹的加法运算符或者乘法运算符或者字母或者数字
样例:‘+’‘-’‘*’‘a’‘_’

<字符串> ::= “{十进制编码为32,33,35-126的ASCII字符}”
分析:定义字符串的格式,字符串是被“”包裹的若干个(可以是0个)十进制ascii码值为32,33,35~126的字符组合
样例:“abcd”

<程序> ::= [<常量说明>][<变量说明>]{<有返回值函数定义>|<无返回值函数定义>}<主函数>
分析:程序定义为严格顺序的 常量说明-字符串说明-有返回值函数定义-无返回值函数定义-主函数 的字符串组合,其中常量说明和变量说明可以没有,如果有,只能出现一次(即不存在多个常量或者变量说明语句),有返回值函数定义和无返回值函数定义可以有若干个,以主程序结尾。
样例:
const int a,b,c;
int q,w,e;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值