本篇我们将设计一门高级语言:Jack。Jack是一门基于面向的对象的语言,具备现代高级语言的基本特性和风格,但是语法相对简单,且不支持继承等高级属性(其实Jack非常寒酸,只是支持了“对象”的功能)。本篇的内容非常简单,主要是介绍Jack的语法。
Hello, World
众所周知,学习一门新语言的第一步,是写一个 Hello, World。
1
2
3
4
5
6
7
class Main {
function void main() { // Jack程序要包含一个Main类,且包含main方法,这是程序的入口函数。
do Output.printString("Hello, World");
do Output.println(); //换行
return;
}
}
精通Jack
学习完 Hello, World,下面让我们再花5分钟时间来精通Jack。
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
class 类名 {
---------变量声明区-----------
可以声明2种变量:
1.成员变量:field
2.静态变量:static
变量类型有4种:
1.基本类型:int, bool, char
2.对象类型:自己定义的类
-----------------------------
--------方法声明区-------------
可以声明3种类型的方法:
1.构造函数:constructor
2.类方法:function
3.实例方式:method
constructor 对象类型 new(入参列表) {
......
return this; //constructor最后一定是return this,this是指向实例的指针
}
function/method 返回类型(可以是void)方法名(入参列表) {
var 类型 变量名 //用var声明局部变量
do xxx.xxx(); //do语句:方法调用
let a = b; //let语句:赋值语句
if else
while
return
}
-----------------------------
}
举例:
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
/** 一个链表类,一个节点存储一个整数. */
class List { // 声明类
field int data; // field语句:声明成员变量
field List next;
/* 构造函数 */
constructor List new(int car, List cdr) { // 参数列表
let data = car; // let语句:语句类型是赋值语句
let next = cdr;
return this; // return语句
}
/** getter. */
method int getData() { return data; }
method int getNext() { return next; }
/** 打印链表 */
method void print() { //method语句:类的实例方法
var List current; // var语句:声明局部变量
let current = this; // this关键字:指向当前对象本身
while (~(current = null)) { //while语句
do Output.printInt(current.getData()); // do语句:后面接一个方法调用
do Output.printChar(32);
let current = current.getNext();
}
return;
}
/** 销毁链表 */
method void dispose() {
if (~(next = null)) { // if语句
do next.dispose();
}
do Memory.deAlloc(this); // 回收内存,调用操作系统方法
return;
}
}
class Main {
function void main() { // fuction语句:声明类方法
var List v;
let v = List.new(5,null);
let v = List.new(2,List.new(3,v));
do v.print();
do v.dispose();
return;
}
}
OK,掌握了Jack后我们下一步的工作是实现Jack的编译器。