go-vise

Constrained Size Output Virtual Machine
Info | Log | Files | Refs | README | LICENSE

commit 3e96e45839350b63e9f50b9cd76c0a69732384c9
parent 1da16595e726192646d6b24b8142fe1f1f6d4200
Author: lash <dev@holbrook.no>
Date:   Fri, 20 Dec 2024 10:58:21 +0000

Add output poc for walker

Diffstat:
MCHANGELOG | 4++++
Adebug/map.go | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdebug/node.go | 9+++++++++
Adebug/parse.go | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdev/walk/main.go | 17+++++------------
5 files changed, 144 insertions(+), 12 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG @@ -1,3 +1,7 @@ +- 0.2.3 + * Node navigation traversal module with pluggable code hooks. + * Developer tool to generate node navigation map. + * Expose code to manually trigger state rewind (asm: MOVE ^) - 0.2.2 * Customizable menu separator * Make available node movement direction detection in state object. diff --git a/debug/map.go b/debug/map.go @@ -0,0 +1,67 @@ +package debug + +import ( + "context" + "strings" + + "git.defalsify.org/vise.git/resource" + "git.defalsify.org/vise.git/state" +) + +type NodeMap struct { + st *state.State + root Node + outs []string +} + +func NewNodeMap(root string) *NodeMap { + n := &NodeMap{ + st: state.NewState(0), + } + n.root.Name = root + return n +} + +func(nm *NodeMap) Run(ctx context.Context, rs resource.Resource) error { + ph := NewNodeParseHandler(&nm.root) + b, err := rs.GetCode(ctx, nm.root.Name) + if err != nil { + return err + } + + _, err = ph.ParseAll(b) + if err != nil { + return err + } + return nm.processNode(ctx, &nm.root, rs) +} + +func(nm *NodeMap) processNode(ctx context.Context, node *Node, rs resource.Resource) error { + nm.st.Down(node.Name) + for true { + n := node.Next() + if n == nil { + break + } + ph := NewNodeParseHandler(n) + b, err := rs.GetCode(ctx, n.Name) + if err != nil { + return err + } + _, err = ph.ParseAll(b) + if err != nil { + return err + } + err = nm.processNode(ctx, n, rs) + if err != nil { + return err + } + } + nm.outs = append(nm.outs, strings.Join(nm.st.ExecPath, "/")) + nm.st.Up() + return nil +} + +func (nm *NodeMap) String() string { + return strings.Join(nm.outs, "\n") +} diff --git a/debug/node.go b/debug/node.go @@ -36,3 +36,12 @@ func (n *Node) Connect(peer Node) bool { func (n *Node) String() string { return n.Name } + +func (n *Node) Next() *Node { + if len(n.conn) == 0 { + return nil + } + r := NodeIndex[n.conn[0]] + n.conn = n.conn[1:] + return &r +} diff --git a/debug/parse.go b/debug/parse.go @@ -0,0 +1,59 @@ +package debug + +import ( + "git.defalsify.org/vise.git/vm" + "git.defalsify.org/vise.git/logging" +) + +var ( + logg = logging.NewVanilla().WithDomain("debug") +) + +type NodeParseHandler struct { + *vm.ParseHandler + node *Node + parentMoveFunc func(string) error + parentInCmpFunc func(string, string) error +} + +func NewNodeParseHandler(node *Node) *NodeParseHandler { + np := &NodeParseHandler{ + ParseHandler: vm.NewParseHandler().WithDefaultHandlers(), + } + np.node = node + np.node.Name = node.Name + np.parentMoveFunc = np.ParseHandler.Move + np.parentInCmpFunc = np.ParseHandler.InCmp + np.Move = np.move + np.InCmp = np.incmp + return np +} + +func (np *NodeParseHandler) move(sym string) error { + var node Node + + if (sym == "<" || sym == ">" || sym == "^" || sym == "_") { + logg.Debugf("skip lateral move") + return np.parentMoveFunc(sym) + } + + node.Name = sym + np.node.Connect(node) + logg.Infof("connect MOVE", "src", np.node.Name, "dst", node.Name) + return np.parentMoveFunc(sym) +} + +func (np *NodeParseHandler) incmp(sym string, sel string) error { + var node Node + + if (sym == "<" || sym == ">" || sym == "^" || sym == "_") { + logg.Debugf("skip relative move") + return np.parentMoveFunc(sym) + } + + + node.Name = sym + np.node.Connect(node) + logg.Debugf("connect INCMP", "src", np.node.Name, "dst", node.Name) + return np.parentInCmpFunc(sym, sel) +} diff --git a/dev/walk/main.go b/dev/walk/main.go @@ -35,19 +35,12 @@ func main() { } rs := resource.NewDbResource(rsStore) - //rs = rs.With(db.DATATYPE_STATICLOAD) - //ph := vm.NewParseHandler().WithDefaultHandlers().WithWriter(os.Stdout) - ph := debug.NewNodeParseHandler("root").WithWriter(os.Stdout) - - b, err := rs.GetCode(ctx, root) + nm := debug.NewNodeMap(root) + err = nm.Run(ctx, rs) if err != nil { - panic(err) - } - - n, err := ph.ParseAll(b) - if err != nil { - panic(err) + fmt.Fprintf(os.Stderr, "node tree process fail: %v", err) + os.Exit(1) } - _ = n + fmt.Printf("%s", nm) }