一个简单编译器的实现过程

本文详细介绍了编译器的实现过程,包括词法分析、语法分析、语义分析、翻译成中间表示等多个阶段。通过实例展示了如何从miniJava构建编译器,并提及了词法分析器的DFA和NFA、语法分析中的消除二义性以及抽象语法树在语义分析中的应用。此外,还讨论了后续的指令选择、寄存器分配和垃圾收集等优化步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、编译器的实现步骤

1、词法分析,将原文件划分为单独的单词或关键字。

2、语法分析,利用上下文无关文法分析程序的短语结构。

3、语义分析,根据短语建立抽象语法树,确定短语含义、变量关联声明、检查表达式类型。

4、翻译,根据抽象语法树翻译成中间表示树不依赖任何特定的程序语言和目标机器结构。

5、指令选择,根据目标机器的指令体系,对中间表示树的节点进行划分。

6、控制流分析。

7、数据流分析。

8、寄存器分配。

9、代码生成。

在上编译原理课程的时候,我们完成了一个基于miniJava的编译器和垃圾回收器


代码:https://github.com/xuhaoavl/tiger

二、词法分析器

1、词法记号,编程语言语法单元的一系列字符,词法记号一般分为有限的几种。

例如:ID(字符串)、NUM(整数)、REAL(实数)、IF(if)、VOID(void)、COMMA(逗号)。。。。

2、正则表达式,一般用正则表达式匹配字符窜的方式检查字符串类型。

符号(a,v,h,b等),或(a|b)、并(a·b)、空(ε)、重复(克林闭包,所有可能的字符串)

有一些可能会产生模糊性,例如if8是字符串还是if和8,对此有以下两种解决方法

a、最长匹配,选择可以匹配正则表达式的最长输入字符串。

b、优先匹配,选择最先与之匹配的正则表达式,这时候正则表达式的顺序很重要。

3、有限自动机DFA,不存在两个从统一状态出发且标记完全相同的边,不存在空串。

一般使用DFA来实现词法分析。

4、非确定有限自动机NFA,可能存在多条从一个状态出发且标记一样的边,也可能有空边。

一般使用正则表达式表示一个语言的词法,然后将其转换为NFA(正则表达式转NFA比较容易),最后再将NFA转DFA,并用代码实现。

三、语法分析

1、上下文无关文法

使用上下文无关文法描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值