随笔-341  评论-2670  文章-0  trackbacks-0
    经过了5个小时的艰苦奋斗,符号表终于计算出来了,而且也做了一部分语法分析。接下来的工作是类型推导。今天的结果如下。

    为了检查符号表,特意在昨天的程序里面加入了以下代码:
1 data pair T1 T2 = pair T1 T2
2 type environment
3 type IO T = environment -> pair T environment
4 type string = list char
5 type TypeOfPrint = string -> IO void

    语法改了一下,让data用于定义新类型,而type用于重命名类型。然后加上了module和import子句。

    符号表包含了类型重命名、data构造函数名、函数名以及表达式名四种类型。其中表达式名用于模式匹配的时候产生的新符号。然后让所有的符号表构成了一个有向图。在这个图中,节点的符号在引用了它的节点中是可见的。在构造这个图的过程当中顺便解决了import循环的问题。

    然后遍历表达式,得到了完整的符号表。每当有新符号产生的地方就构造新的节点。符号表完成之后,同时也确保了整个程序中所有表达式中的名字都是已经定义过的。于是输入昨天的程序,得到如下结果。

    首先,编译器自己产生一个API语法树:
 1   module system
 2   type void
 3   type int
 4   type char
 5   data bool = (false | true)
 6   data list T = (empty | (list T (list T)))
 7   func iadd :: (int -> (int -> int)) alias "iadd"
 8   func isub :: (int -> (int -> int)) alias "isub"
 9   func imul :: (int -> (int -> int)) alias "imul"
10   func idiv :: (int -> (int -> int)) alias "idiv"
11   func imod :: (int -> (int -> int)) alias "imod"
12   func ilg :: (int -> (int -> bool)) alias "ilg"
13   func ism :: (int -> (int -> bool)) alias "ism"
14   func iequ :: (int -> (int -> bool)) alias "iequ"
15   func chr :: (int -> char) alias "chr"
16   func ord :: (char -> int) alias "ord"

    然后,读入代码。下面是格式化后的结果:
 1   module main
 2   import system
 3 
 4   data pair T1 T2 = (pair T1 T2)
 5 
 6   type environment
 7 
 8   type IO T = (environment -> (pair T environment))
 9 
10   type string = (list char)
11 
12   type TypeOfPrint = (string -> (IO void))
13 
14   func not :: (bool -> bool)
15   def not a = 
16     select a of
17       case true : false
18       case false : true
19     end
20 
21   func and :: (bool -> (bool -> bool))
22   def and a b = 
23     select a of
24       case true : b
25       case false : false
26     end
27 
28   func or :: (bool -> (bool -> bool))
29   def or a b = 
30     select a of
31       case true : true
32       case false : b
33     end
34 
35   func xor :: (bool -> (bool -> bool))
36   def xor a b = 
37     select a of
38       case true : (not b)
39       case false : b
40     end
41 
42   func if T :: (bool -> (T -> T))
43   def if cond t f = 
44     select cond of
45       case true : t
46       case false : f
47     end
48 
49   func ineg :: (int -> int)
50   def ineg num = ((isub 0) num)
51 
52   func coffset :: (char -> (int -> char))
53   def coffset c i = (chr ((iadd (ord c)) i))
54 
55   func itoa :: (int -> (list char))
56   def itoa a = (((if ((iequ a) 0)) ((list '0') empty)) (((if ((ism a) 0)) ((list '-') (itoa (ineg a)))) 
57     (let
58       func _itoa :: (int -> ((list char-> (list char)))
59       def _itoa a chs = 
60         select a of
61           case 0 : chs
62           else : ((_itoa ((idiv a) 10)) ((list ((coffset '0') ((imod a) 10))) chs))
63         end
64     in((_itoa a) empty))))
65 
66   func atoi :: ((list char-> int)
67   def atoi chs = 
68     select chs of
69       case empty : 0
70       case ((list '-') chs) : (ineg (atoi chs))
71       case ((list c) chs) : ((iadd ((imul 10) ((isub (ord c)) (ord '0')))) (atoi chs))
72     end

    经过一些检查并得到符号表之后,就有了如下的结果:
 1 【ID表】
 2   module main::main
 3   import system
 4   type IO T = (main.environment -> (main.pair <T> main.environment))
 5   type TypeOfPrint = ((system.list system.char-> (main.environment -> (main.pair system.void main.environment)))
 6   type environment
 7   type pair T1 T2
 8   type string = (system.list system.char)
 9   ctor pair = <T1> -> <T2> -> type pair T1 T2
10   func and :: (system.bool -> (system.bool -> system.bool)) codefrom 8
11   func atoi :: ((system.list system.char-> system.int) codefrom 22
12   func coffset :: (system.char -> (system.int -> system.char)) codefrom 18
13   func if T :: (system.bool -> (<T> -> <T>)) codefrom 14
14   func ineg :: (system.int -> system.int) codefrom 16
15   func itoa :: (system.int -> (system.list system.char)) codefrom 20
16   func not :: (system.bool -> system.bool) codefrom 6
17   func or :: (system.bool -> (system.bool -> system.bool)) codefrom 10
18   func xor :: (system.bool -> (system.bool -> system.bool)) codefrom 12
19 【ID表】
20   module main::main.0
21   import main
22   name a
23 【ID表】
24   module main::main.1
25   import main
26   name a
27   name b
28 【ID表】
29   module main::main.2
30   import main
31   name a
32   name b
33 【ID表】
34   module main::main.3
35   import main
36   name a
37   name b
38 【ID表】
39   module main::main.4
40   import main
41   name cond
42   name f
43   name t
44 【ID表】
45   module main::main.5
46   import main
47   name num
48 【ID表】
49   module main::main.6
50   import main
51   name c
52   name i
53 【ID表】
54   module main::main.7
55   import main
56   name a
57 【ID表】
58   module main::main.7.0
59   import main.7
60   func _itoa :: (system.int -> ((system.list system.char-> (system.list system.char))) codefrom 1
61 【ID表】
62   module main::main.7.0.0
63   import main.7.0
64   name a
65   name chs
66 【ID表】
67   module main::main.8
68   import main
69   name chs
70 【ID表】
71   module main::main.8.1
72   import main.8
73   name chs
74 【ID表】
75   module main::main.8.2
76   import main.8
77   name c
78   name chs
79 【ID表】
80   module system::system
81   type bool
82   type char
83   type int
84   type list T
85   type void
86   ctor empty = type list T
87   ctor false = type bool
88   ctor list = <T> -> (system.list <T>-> type list T
89   ctor true = type bool
90   func chr :: (system.int -> system.char) alias chr codefrom -1
91   func iadd :: (system.int -> (system.int -> system.int)) alias iadd codefrom -1
92   func idiv :: (system.int -> (system.int -> system.int)) alias idiv codefrom -1
93   func iequ :: (system.int -> (system.int -> system.bool)) alias iequ codefrom -1
94   func ilg :: (system.int -> (system.int -> system.bool)) alias ilg codefrom -1
95   func imod :: (system.int -> (system.int -> system.int)) alias imod codefrom -1
96   func imul :: (system.int -> (system.int -> system.int)) alias imul codefrom -1
97   func ism :: (system.int -> (system.int -> system.bool)) alias ism codefrom -1
98   func isub :: (system.int -> (system.int -> system.int)) alias isub codefrom -1
99   func ord :: (system.char -> system.int) alias ord codefrom -1

    这张表中的每一个type的定义都被充分地展开,每一个data的构造函数(ctor)的引用也被分析出。函数的类型也被展开,codefrom代表函数的代码所在的原语法树的某个位置中。

    那写名字是XXX.1.2.3的是函数体、lambda表达式或case里面的子表。因为这三中表达式产生了新的符号。可以通过读取import节来还原出整个图的样貌。这个图是没有环的,也就是说可以用智能指针安全方便地管理。注意看那些有name节的符号表,要么是函数参数,要么是case中用于记录子模式表达式的新符号。还有一些带有func、ctor和type的则是let in表达式产生的新符号。
posted on 2008-10-02 07:46 陈梓瀚(vczh) 阅读(1680) 评论(1)  编辑 收藏 引用 所属分类: 脚本技术

评论:
# re: Kernel FP符号表完成 2008-10-03 06:12 | 免费小说
C++ 感觉不好上手。。。。
  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理