返回

从代码到程序

随手记录的一些编译原理笔记。


现代编译器分为前后端,为了进一步降低复杂度(模块化),前端的流程通常是:

词法分析 -> 语法分析 -> 语义分析

上一步的输出是下一步的输入。

词法分析

常见的应用有正则表达式。

先定义一个映射, tokens = map(字符串)

这个token是啥呢,比如说我有下面这个算式:

1 + 2 * 3

解析后:

类型
整数
+ 加号
2 整数
* 乘号
3 整数

我们暂时不知道有什么用,但现在我们解决了字符串里的空格,如果字符串里有奇怪的字符,比如#啥的,也可以报错。

怎么解析其实也是个大问题,通常用自动机解决这个问题。

语法分析

把词法分析输出的一堆token,组合成句子,检查句子的语法,最后生成抽象语法树(AST)

AST用处广泛,比如:

  • 编辑器错误提示
  • 代码格式化
  • 代码高亮
  • 代码自动补全