主页

索引

模块索引

搜索页面

手把手带你写一门编程语言

目录

开篇

示例:

// 一个函数的声明,这个函数很简单,只打印 "Hello World!"
function sayHello(){
    println("Hello World!");
}
// 调用刚才声明的函数
sayHello();

词法分析

https://img.zhaoweiguo.com/knowledge/images/cores/compilers/langs/lexical-analysis1.jpeg

词法分析:拆分 Token 串(图中不同的颜色代表不同类型的 Token)

https://img.zhaoweiguo.com/knowledge/images/cores/compilers/langs/lexical-analysis2.jpeg

词法分析:分隔符

https://img.zhaoweiguo.com/knowledge/images/cores/compilers/langs/lexical-analysis3.jpeg

词法分析:状态迁移图,有限自动机:解析 -、– 和 -= 三种 Token 的有限自动机

https://img.zhaoweiguo.com/knowledge/images/cores/compilers/langs/lexical-analysis3.jpeg

词法分析:增加了对多行注释、/、/=、标识符、关键字和空白字符处理能力的有限自动机。你还可以继续扩展这个图,直到它能够提取所有的 Token 为止。有了这个大图之后,你就可以照着这个图写程序了。

备注

做词法分析的一个最佳实践,就是先把标识符和关键字统一提取出来,然后再从里面把关键字单独提取出来就行了。

语法分析

https://img.zhaoweiguo.com/knowledge/images/cores/compilers/langs/parsing-analysis1.jpeg

语法分析:解析器的工作,就是要读取一个 Token 串,然后把它转换成一棵 AST

语法分析的思路(递归下降算法):

首先,写出语法规则,比如说用 EBNF 格式。
第二,根据语法规则,分别匹配每个子元素。
    递归下降(Recursive Descent)
第三,如果一条语法规则可能有多个展开方式
    要依次尝试去匹配

语义分析

引用消解(Refrence Resolving)

主页

索引

模块索引

搜索页面