承接上一篇日志, 我对原来的解释器做一点小小的改动. 大致增加了如下特性: 1, 允许for(int i = 0; i < 23; i++) 这样使用for循环, 即在for的括号内部定义循环控制变量. 2,增加了continue关键字. 3, 增加了对一些新的数据类型的支持, bool, char, short, int, long, float, double都给予了支持. 4, 增加了true/false关键字, 直接对bool变量赋值. 关于增加新的数据类型这件事, 一开始我的想法是: 定义一个结构体, 用来表达上面支持的所有类型, 该结构体会根据实际的类型返回正确的值. 1 struct var 2 { 3 int type; 4 union 5 { 6 char char_val; 7 bool bool_val; 8 int int_val; 9 double double_val; 10 float float_val; 11 long long_val; 12 }value; 13 }; 当做加法运算的时候, c = a + b; 这里a 和b可以利用某种运算直接返回正确的值, 这样就可以依赖C++语言自身来处理这个加法了. 不过至于如何能让一个结构体根据实际类型返回正确的值这个问题, 其实就是在构造一种动态类型, 仔细想想python里面的动态类型应该就是用C这样写出来的. 关于如何实现动态语言类型, 可以看看<python源码剖析>的吧, 不过这里就不搞这件事了, 我直接用一些判断撸过了~ 1 //这是个匿名的var结构体, 存储了变量的类型和值, 但是是个匿名的, 2 //类似python里面的变量的引用的概念 3 struct anonymous_var 4 { 5 token_ireps var_type; // data type 6 long int_value; 7 double float_value; 8 }; 9 // This structure encapsulates the info 10 // associated with variables. 11 struct var 12 { 13 char var_name[MAX_ID_LEN + 1]; // name 14 anonymous_var value; 15 }; 上面就是我现在使用的结构体的代码, 用long值存储所有的整型数据, double值存储所有的浮点数. 做各种运算的时候, 会将低级别的统一成高级别的来操作, 就是做了一下算数转换, 这样实现起来比较简单. 所有的整型之间运算使用long值来结算, 所有浮点使用double值类结算, 整型和浮点之间运算会把整型数据先转化成浮点的. 结构体里面只存了long和double, 而在需要使用相应的值的时候(比如要打印一个char)会再把对应的高级类型转化回去, 可以参看exec_cout函数体. 下面是我改进后的代码: 敬告, 代码依然很脆弱, 请使用简单而且语法正确的程序测试, 而且可能我的改动会引入更多的bug, 所以仅供参考. ![]() ~~ Feedback下面这段代码可以被成功解释~
|
|