Tutorial教程

自创编译器 Journal - Part 1


似乎又好久没更新了233。刚好Christmas,就打算最近多post一些。稍微预告一下,最近应该会多发一点博客内容,both 中文 and English。

还有,这是我第一次做真正Technical的文章,所以please在评论区告诉我你是否喜欢或any suggestions,十分appreciate!

切入主题,由于圣诞节,所以想做一个大一点的Project,想来想去,似乎自己一直很想做一个自己的Compiler。那就做一个吧,刚好学习一下底层编程。

OK,那我们得先解决第一个问题,叫啥?
Let's see, Java的名字来源于啥,咖啡!那我也起一个和食物有关的名字吧。诶,我昨晚吃了啥,巧克力!那么,不久显而易见吗,Chocola。
233是的,我就这么命名了我的编译器

Next step,诶有点蒙啊,完全不知道从哪里下手┌(。Д。)┐。 Emmmmmmm.....
俗话说得好,不会就谷歌或油管!于是,就在youtube里面搜“Step by step writing a compiler。” 然后,就找到了这个东西


看起来似乎还不错,结果点开来唉呀妈呀什么鬼口音。
似乎是波兰accent混杂着某种German口音?不过好险有字幕,否者就真活见鬼了

(由于我自己目前也没完全搞懂怎么写编译器,所以我就把Source发上来,有兴趣的童鞋可以自己看看原版)

原来编译器主要是用两个东西写的,Flex 和 Bison (Source: www.oreilly.com)。
Flex 负责 Lexical Analysis(scanning) 或 词法分析,in other words,他可以把一个写好的语句切成段
Bison 负责 Syntax Analysis(parsing) 或 句法分析,也就是理解切好的词让其有意义。

这里有一个non-program Example
Marry is tall
Flex的任务就是把这个切分成4个单独的单词,Marry,is,a,little
Bison的任务就是让这个make sense。比如说,这个句子符合 Noun be动词 Adjective,所以根据这个语法,我们把tall这个属性赋值给Marry

这里有一个编程的类似的example
int a = 123
Flex 把这个拆封成 4个独立的token: int,a,=,123。
Bison 看见这里符合 data_type name = number,这个模式,所以execute对应的code,也就是创建变量a为int数据类型,并且对其赋值为123。

所以编写一个编译器实际上有两个任务,如何把一个程序切成段,无论是对每一个;或空格进行切割。还有就是如何对切割出来的词做出interpretation,并运行对应的代码。


这篇就先这样了,下两篇我准备把 Flex 和 Bison分开讲,然后再看怎么样。

感谢观看!Plz comment



CodeTiger
2019.12.24