Integrate repl with debugger

This commit is contained in:
Anton Medvedev
2023-08-15 16:40:36 +02:00
parent bac96c2c29
commit 7e1b727f95
5 changed files with 77 additions and 17 deletions
+4 -1
View File
@@ -58,7 +58,10 @@ func StartDebugger(program *Program, env interface{}) {
}()
index := make(map[int]int)
for row, line := range strings.Split(program.Disassemble(), "\n") {
var buf strings.Builder
program.Opcodes(&buf)
for row, line := range strings.Split(buf.String(), "\n") {
if line == "" {
continue
}
+13 -1
View File
@@ -4,9 +4,21 @@ go 1.20
require (
github.com/antonmedv/expr v0.0.0
github.com/antonmedv/expr/debug v0.0.0
github.com/chzyer/readline v1.5.1
)
require golang.org/x/sys v0.11.0 // indirect
require (
github.com/gdamore/encoding v1.0.0 // indirect
github.com/gdamore/tcell v1.3.0 // indirect
github.com/lucasb-eyer/go-colorful v1.0.3 // indirect
github.com/mattn/go-runewidth v0.0.8 // indirect
github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 // indirect
github.com/rivo/uniseg v0.1.0 // indirect
golang.org/x/sys v0.11.0 // indirect
golang.org/x/text v0.3.2 // indirect
)
replace github.com/antonmedv/expr => ../
replace github.com/antonmedv/expr/debug => ../debug
+21
View File
@@ -1,3 +1,4 @@
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM=
github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=
github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI=
@@ -7,16 +8,36 @@ github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM=
github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM=
github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s=
github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac=
github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0=
github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 h1:4CFNy7/q7P06AsIONZzuWy7jcdqEmYQvOZ9FAFZdbls=
github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84=
github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+32 -13
View File
@@ -2,44 +2,54 @@ package main
import (
"fmt"
"os"
"strings"
"github.com/antonmedv/expr"
"github.com/antonmedv/expr/builtin"
"github.com/antonmedv/expr/debug"
"github.com/antonmedv/expr/vm"
"github.com/chzyer/readline"
)
var keywords = []string{
"exit", "opcodes", "debug",
// Predicate functions:
"map", "filter", "all",
"any", "none", "one",
// Operators:
"and", "or", "in", "not", "not in",
"contains", "matches", "startsWith", "endsWith",
}
func main() {
extra := []string{
"exit",
"opcodes",
"map",
"filter",
"all",
"any",
"none",
"one",
}
rl, err := readline.NewEx(&readline.Config{
Prompt: "> ",
AutoComplete: completer{append(builtin.Names, extra...)},
AutoComplete: completer{append(builtin.Names, keywords...)},
})
if err != nil {
panic(err)
}
defer rl.Close()
env := map[string]interface{}{
"ENV": os.Environ(),
}
var program *vm.Program
for {
line, err := rl.Readline()
if err != nil { // io.EOF when Ctrl-D is pressed
break
}
line = strings.TrimSpace(line)
if line == "exit" {
break
}
if line == "opcodes" {
if program == nil {
fmt.Println("no program")
@@ -49,12 +59,21 @@ func main() {
continue
}
program, err = expr.Compile(line, expr.Env(nil))
if line == "debug" {
if program == nil {
fmt.Println("no program")
continue
}
debug.StartDebugger(program, env)
continue
}
program, err = expr.Compile(line, expr.Env(env), expr.ExperimentalPipes())
if err != nil {
fmt.Printf("compile error: %s\n", err)
continue
}
output, err := expr.Run(program, nil)
output, err := expr.Run(program, env)
if err != nil {
fmt.Printf("runtime error: %s\n", err)
continue
+7 -2
View File
@@ -3,6 +3,7 @@ package vm
import (
"bytes"
"fmt"
"io"
"reflect"
"regexp"
"strings"
@@ -27,6 +28,12 @@ type Program struct {
func (program *Program) Disassemble() string {
var buf bytes.Buffer
w := tabwriter.NewWriter(&buf, 0, 0, 2, ' ', 0)
program.Opcodes(w)
_ = w.Flush()
return buf.String()
}
func (program *Program) Opcodes(w io.Writer) {
ip := 0
for ip < len(program.Bytecode) {
pp := ip
@@ -275,6 +282,4 @@ func (program *Program) Disassemble() string {
_, _ = fmt.Fprintf(w, "%v\t%#x (unknown)\n", ip, op)
}
}
_ = w.Flush()
return buf.String()
}