目标手写一个编译器。
假设有这么一个活动,卖商品获得积分,100以内+2分,100-500+3分,但是如果加到1w,if,else就不好写了,而且还会经常被搞,规则可能过两天就有一次修改。通过这个方法可以简单的实现,但具体如何实现想破头也想不明白,所以就跟着视频来看看吧
编译原理
词法分析
通过有限状态机来形成词法分析器。
词法分析的结果就是识别出各个单词,比如上面的price ,> ,500, &&, isNewUser 类似。
语法分析 生成一棵树,如上图所示,这个语法分析树中的每一个词都是一种规则,pri表示最低级规则,可以是变量,常量,
mul规则就是乘法规则,它可以是递归乘一个pri或者就是一个pri。
在这个例子里面,一直要往上找直到遇到下一个可匹配元素,是>满足cmp规则。于是乎生成了一颗只有price > 500的语法树。
这个过程遵循后序遍历。首先会运行price>500的判断然后再加上结果。 最后的或运算将会判断结果,有一些运算符可以根据左右子树的结果来判断这个指令是否是正确的,如果错误就会报错,比如大于号左右两端必须是数字。
项目
token 词法分析的结果都会在一个enum中Kind,里面有各个类型。
还有许多不一一列出。
Kind是一个int类型的东西,但同时它还实现了多个方法,go语言特色。
lexer是词法分析器,token是一个类,它继承自Kind,同时也有Value值是个借口,还有位置信息。
type Token struct {
Kind Kind
Value interface{}
Position int
}
另外还有很多以后再看吧。