1
1
package main
2
2
3
3
import (
4
+ "bufio"
4
5
"flag"
5
6
"fmt"
6
7
"github.com/antonmedv/expr/compiler"
@@ -16,13 +17,15 @@ var (
16
17
debug bool
17
18
run bool
18
19
ast bool
20
+ repl bool
19
21
)
20
22
21
23
func init () {
22
24
flag .BoolVar (& bytecode , "bytecode" , false , "disassemble bytecode" )
23
25
flag .BoolVar (& debug , "debug" , false , "debug program" )
24
26
flag .BoolVar (& run , "run" , false , "run program" )
25
27
flag .BoolVar (& ast , "ast" , false , "print ast" )
28
+ flag .BoolVar (& repl , "repl" , false , "start repl" )
26
29
}
27
30
28
31
func main () {
@@ -44,6 +47,10 @@ func main() {
44
47
debugger ()
45
48
os .Exit (0 )
46
49
}
50
+ if repl {
51
+ startRepl ()
52
+ os .Exit (0 )
53
+ }
47
54
48
55
flag .Usage ()
49
56
os .Exit (2 )
@@ -92,3 +99,37 @@ func runProgram() {
92
99
93
100
litter .Dump (out )
94
101
}
102
+
103
+ func startRepl () {
104
+ scanner := bufio .NewScanner (os .Stdin )
105
+ prompt ()
106
+
107
+ for scanner .Scan () {
108
+ line := scanner .Text ()
109
+
110
+ tree , err := parser .Parse (line )
111
+ if err != nil {
112
+ fmt .Printf ("%v\n " , err )
113
+ continue
114
+ }
115
+
116
+ program , err := compiler .Compile (tree )
117
+ if err != nil {
118
+ fmt .Printf ("%v\n " , err )
119
+ continue
120
+ }
121
+
122
+ out , err := vm .Run (program , nil )
123
+ if err != nil {
124
+ fmt .Printf ("%v\n " , err )
125
+ continue
126
+ }
127
+
128
+ fmt .Printf ("%v\n " , litter .Sdump (out ))
129
+ prompt ()
130
+ }
131
+ }
132
+
133
+ func prompt () {
134
+ fmt .Print ("> " )
135
+ }
0 commit comments