一:概述
编译器通常分为两部分——前端和后端。在本文中,我们将实现编程语言的前端部分——即主要处理源语言的部分。我们将学习现实世界编译器使用的技术,并将其应用到我们的编程语言中。
本文将从定义编程语言的语法开始,最终生成一个抽象语法树(AST),这是代码生成的基础。我们可以将这种方法应用于其他编程语言。
在本章中,我们将学习以下内容:
- 定义一个真正的编程语言,我们将学习tinylang语言,它是一个真实编程语言的子集,将为它实现一个编译器前端
- 组织编译器项目的目录结构
- 知道如何处理编译器的多个输入文件
- 具备处理用户消息并以愉悦的方式告知他们
- 使用模块化组件构建词法分析器(lexer)
- 从语法规则出发构建递归下降解析器,进行语法分析
- 通过创建AST并分析其特征来进行语义分析
通过本文介绍的知识,我们将能够为任何编程语言构建编译器前端。
二:使用BNF文法定义一个语言
为了深入了解细节,在本文中,我们将定义一个支持泛型(generics)和面向对象编程(OOP)的语言。我们将这个语言称为 tinylang。