-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
92 lines (80 loc) · 1.52 KB
/
main.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
82
83
84
85
86
87
88
89
90
91
92
package main
import (
"fmt"
"os"
"github.com/patrick-jessen/script/compiler/analyzer"
"github.com/patrick-jessen/script/compiler/generator"
"github.com/patrick-jessen/script/compiler/linker"
"github.com/patrick-jessen/script/utils/color"
"github.com/patrick-jessen/script/vm"
)
type command int
const compVer = "0.1"
const (
cmdRun command = iota
cmdDebug
cmdBuild
)
var (
dir = "./src" // TODO: change to ./
cmd = cmdRun
)
func printHelp() {
fmt.Println(
"Script ver. " + compVer + "\n" +
"Usage:\n" +
" script <command> [srcDir]\n" +
"Commands:\n" +
" run\n" +
" runs the application\n" +
" debug\n" +
" debugs the application\n" +
" build\n" +
" builds the application to an executable\n",
)
}
func handleArgs() bool {
if len(os.Args) > 1 {
switch os.Args[1] {
case "run":
cmd = cmdRun
case "build":
cmd = cmdBuild
case "debug":
cmd = cmdDebug
default:
fmt.Println(color.Red("Invalid command\n"))
printHelp()
return false
}
} else {
printHelp()
return false
}
if len(os.Args) > 2 {
dir = os.Args[2]
if _, err := os.Stat(dir); err != nil {
fmt.Println(color.Red("Invalid path\n"))
printHelp()
return false
}
}
return true
}
func main() {
if !handleArgs() {
return
}
analyzer := analyzer.New(dir)
analyzer.Run()
generator := generator.New(analyzer)
prog := generator.Run()
switch cmd {
case cmdRun:
vm.Run(prog, false)
case cmdDebug:
vm.Run(prog, true)
case cmdBuild:
linker.Run(prog)
}
}