分享

简单的C++解释器1.02

 quasiceo 2016-07-15

承接上一篇日志我对原来的解释器做一点小小的改动.

大致增加了如下特性:

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, 所以仅供参考.

View Code

~~

posted on 2012-09-15 20:00 Jackiesteed 阅读(1100) 评论(2)  编辑 收藏

Feedback

#1楼[楼主] 2012-09-15 20:01Jackiesteed  
下面这段代码可以被成功解释~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* Mini C++ Demonstration Program #1.
   This program demonstrates all features
   of C++ that are recognized by Mini C++.
*/
double b = 123.23;
char c = 'a';
int main()
{
    cout << b + 1 << endl;
    char b = c + 1;
    cout << b << endl;
    for(int i = 0; i < 4; i++)
    {
        if(i == 0)
        {
            cout << "i == 0" << endl;
            continue;
        }
        else
        {
            cout << "in else" << endl;
            cout << i + 1 << endl;
        }
    }
    double v = 0.5;
    while(v < 4.6)
    {
        v = v + 1.4;
        cout << v * 1.3 << endl;
    }
    double mmm = 123.23;
    if(mmm + 2 < 126)
    {
        cout << "jackie" << endl;
    }
    else
    {
        cout << "andy" << endl;
    }
    bool x = 0;
    cout << x << endl;
    long a = 123124534;
    cout << a * 10 << endl;
    bool bool_val = true;
    cout << bool_val << endl;
    bool_val = false;
    cout << bool_val << endl;
    return 0;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多