-
Notifications
You must be signed in to change notification settings - Fork 7
/
builtin.go
81 lines (63 loc) · 1.55 KB
/
builtin.go
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package builtin
import (
"io/ioutil"
"knox/ast"
"knox/lexer"
"knox/parser"
)
// import "knox/ast"
// Init setups the builtin.
func Init(node *ast.Node) *ast.Node {
node = createBuiltin("list", node)
node = createBuiltin("stl", node)
return node
}
func createBuiltin(name string, node *ast.Node) *ast.Node {
code, err := ioutil.ReadFile("builtin/" + name + ".knox")
if err != nil {
panic(err)
}
l := lexer.New(string(code) + "\n")
p := parser.New(l)
a := p.Program()
// Merge global symtables
for key, val := range a.Symbols.Entries {
node.Symbols.InsertSymbol(key, val)
}
// Update all the parent nodes
for _, declaration := range a.Children {
if declaration.Type == ast.FUNCDECL {
declaration.Children[3].Symbols = node.Symbols
} else if declaration.Type == ast.CLASS {
declaration.Children[0].Symbols = node.Symbols
}
}
node.Children = append(node.Children, a)
return node
}
func createClass(name string, sym *ast.SymTable) *ast.Node {
var node ast.Node
node.Type = ast.CLASS
var identNode ast.Node
identNode.Type = ast.IDENT
identNode.TokenStart.Literal = name
var blockNode ast.Node
blockNode.Type = ast.BLOCK
st := ast.NewSymTable()
st.Parent = sym
blockNode.Symbols = st
node.Children = append(node.Children, identNode, blockNode)
return &node
}
// // Functions for casting.
// func createCasts() {
// }
// // Placeholder for std lib.
// func createStdLib() {
// }
// // Builtin methods for lists.
// func createListFuncs() {
// fLength := "func Length() int {return -1;}"
// // Call parser
// // Rename node
// }