从头学习compiler系列3——COOL语言实践

1,安装、运行

    根据课程的说明,我们首先下载Oracle VirtualBox(https://www.virtualbox.org/wiki/Downloads)。然后下载课程特地准备的linux环境的镜像文件(https://www.virtualbox.org/wiki/Downloads)。此linux环境包含了compiler课程的各个部分。
    运行VirtualBox,新建,选择linux ubuntu,打开镜像文件Compilers.vdi。设置好后,启动虚拟机。
    默认进入界面版本,有点类似windows。这里示范用命令行的操作。
    打开命令行终端,输入: (引号内)“cd cool/examples/“回车。此目录下全是Cool文件(后缀为cl),我们运行一个最简单的。输入:“coolc hello_world.cl"回车。此时生成MIPS处理器的汇编文件hello_world.s,需要用spim来模拟运行汇编(以后到代码生成阶段会详细讲解)。输入:”spim hello_word.s“回车。运行结果如下:
    
    其中Hello, World.就是运行结果。同理,example/文件夹下的所有cl文件都可以成功执行。

2,简单实践

    2.1 简单加法

        目的:建立两个变量,并输出。
        建立局部变量用let表达式,输出用out_int函数。因为输出函数是IO类里的,所以Main必须继承或者建立一个IO类。
        代码如下:
        class Main inherits IO {
            main() : SELF_TYPE {
            {
                let x:Int <- 1, y:Int in
                {
                    y <- 2;
                    out_int(x+y);
                };
                out_string("\n");
            }
            };
        };
        let建立了x、y两个局部变量,只在let内有效。x初始值为1,设置y值为2,输出x+y的值。{}内可以有多个表达式,用分号";"隔开。

    2.2 简单函数

        目的:写函数并调用
        注意函数的格式和返回值。代码如下:
        class Main inherits IO {
            main() : SELF_TYPE {
            {
                out_string("The factorial of 4 is ");
                out_int(func(4));
                out_string("\n");
            }
            };
 
            func(n:Int) : Int {
            {
                let sum:Int <- 1 in
                {
                    while 0 < n loop
                    {
                        sum <- sum * n;
                        n <- n - 1;
                    }
                    pool;
                    sum;
                };
            }
            };
        };
        func函数返回参数n的阶乘。用while循环不断的累乘,func的返回值是最后一个语句let的返回值,let的返回值是let内部的最后一个语句,所以sum就是返回值。关于表达式的返回值,在以后句法一章的时候会讲到。



原文地址:https://www.cnblogs.com/pinkman/p/3078812.html