-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
89 lines (81 loc) · 1.53 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
package main
import (
"fmt"
"log"
"strings"
"github.com/chzyer/readline"
)
//var bracketStack = 0
var braceStack = 0
func main() {
err := setUp()
if err != nil {
log.Fatal("setup error: %v", err)
return
}
defer cleanUp()
mainloop()
}
func mainloop() {
// init current buffer
curBuffer := increBuffer
fmt.Println("Goshell v1.0 (2016-9-1 17:28:02)")
fmt.Println(`Type "quit" to exit`)
rl, err := readline.New(">>> ")
if err != nil {
panic(err)
}
defer rl.Close()
for {
//str, _ := reader.ReadString('\n')
str, err := rl.Readline()
if err != nil {
log.Fatal("read line error: %v", err)
}
if strings.Trim(str, " \n") == "quit" {
break
}
str += "\n"
switch statementType(str) {
case stImport: // import
importBuffer.WriteString(str)
/*
case ST_TYPE_LEFT_BRACKET:
curBuffer.WriteString(str)
bracketStack += 1
case ST_TYPE_RIGHT_BRACKET:
curBuffer.WriteString(str)
bracketStack -= 1
if bracketStack <= 0 {
bracketStack = 0
run()
}
*/
case stLeftBrace: // '{' found at the end
curBuffer.WriteString(str)
braceStack++
case stRightBrace: // '}' found
curBuffer.WriteString(str)
braceStack--
if braceStack <= 0 {
braceStack = 0
curBuffer = increBuffer
execute()
}
case stAssign:
curBuffer.WriteString(str)
case stFunc:
// begin func
braceStack++
curBuffer = funcBuffer
curBuffer.WriteString(str)
case stEmptyStr:
// do nothing
default:
curBuffer.WriteString(str)
if braceStack <= 0 {
execute()
}
}
}
}