只要我一直在编程(现在只有 5 年),我就一直对编译器/解释器的设计/实现感兴趣,而且它总是看起来像没有人真正谈论的幕后“魔法”(我至少知道2 个操作系统开发论坛,但我不知道有任何编译器/解释器/语言开发社区)。无论如何,最近我决定开始自己工作,希望能扩展我对整个编程的了解(嘿,这很有趣:)。因此,基于我拥有的有限阅读材料和维基百科,我为编译器/解释器开发了这个组件概念:
源代码 -> 词法分析 -> 抽象语法树 -> 句法分析 -> 语义分析 -> 代码生成 -> 可执行代码。
(我知道代码生成和可执行代码还有更多内容,但我还没有做到这一点:)
有了这些知识,我创建了一个非常基本的词法分析器(在 Java 中)来从源文件中获取输入,并将标记输出到另一个文件中。示例输入/输出如下所示:
输入:
int a := 2
if(a = 3) then
print "Yay!"
endif
输出(来自词法分析器):
INTEGER
A
ASSIGN
2
IF
L_PAR
A
COMP
3
R_PAR
THEN
PRINT
YAY!
ENDIF
就个人而言,我认为从那里开始进行句法/语义分析,甚至可能是代码生成真的很容易,这让我产生疑问:为什么要使用 AST,而我的词法分析器似乎做得同样好?然而,我用来研究这个主题的 100% 的资源似乎都坚持认为这是任何编译器/解释器的必要部分。我是否错过了 AST 的真正含义(显示程序逻辑流程的树)?
TL;DR:目前正在开发编译器,完成词法分析器,在我看来,输出将有助于轻松进行句法分析/语义分析,而不是进行 AST。那么为什么要使用一个呢?我错过了一个点吗?
谢谢!