From 8cf10efe3b5a1bcc70bc6e5590ee63fd5eb00c5b Mon Sep 17 00:00:00 2001
From: Charlie Stanton <charlie@shtanton.xyz>
Date: Wed, 19 Jul 2023 11:57:59 +0100
Subject: Huge refactor to a more value based system, doing away with
 terminals. Also introduces unit testing

---
 main/command.go | 12 ++++++------
 main/lex.go     |  2 +-
 main/main.go    |  8 ++++----
 main/parse.go   | 54 +++---------------------------------------------------
 4 files changed, 14 insertions(+), 62 deletions(-)

(limited to 'main')

diff --git a/main/command.go b/main/command.go
index ef48596..5a898e2 100644
--- a/main/command.go
+++ b/main/command.go
@@ -1,8 +1,8 @@
 package main
 
 import (
-	"main/walk"
 	"main/subex"
+	"main/walk"
 	"fmt"
 )
 
@@ -46,7 +46,7 @@ func (cmd AppendNextCommand) exec(state *ProgramState) {
 	if err != nil {
 		panic("Missing next value")
 	}
-	state.value = walk.ConcatData(state.value, nextItem.Value)
+	state.value = append(state.value, nextItem.Value...)
 	state.path = nextItem.Path
 	state.pc++
 }
@@ -72,12 +72,12 @@ func (cmd DeletePathCommand) String() string {
 	return "D"
 }
 
-func runSubex(state subex.Transducer, in []walk.Atom) (out []walk.Atom, error bool) {
-	atomsOut, error := subex.RunTransducer(state, in)
+func runSubex(state subex.Transducer, in walk.ValueList) (walk.ValueList, bool) {
+	out, error := subex.RunTransducer(state, in)
 	if error {
 		return nil, true
 	}
-	return atomsOut, false
+	return out, false
 }
 
 type SubstituteValueCommand struct {
@@ -193,7 +193,7 @@ func (cmd SwapPathCommand) String() string {
 
 type AppendPathCommand struct {}
 func (cmd AppendPathCommand) exec(state *ProgramState) {
-	state.path = walk.ConcatData(state.path, state.value)
+	state.path = append(state.path, state.value...)
 	state.pc++
 }
 func (cmd AppendPathCommand) String() string {
diff --git a/main/lex.go b/main/lex.go
index 198c346..496abd0 100644
--- a/main/lex.go
+++ b/main/lex.go
@@ -180,7 +180,7 @@ func lexCommand(l *lexer) stateFunc {
 		case '}':
 			l.emit(TokenRBrace)
 			return lexCommand
-		case 's', 'S', 'f', 'F', 'l', 'L', 'a', 'A':
+		case 's', 'S':
 			l.emit(TokenCommand)
 			return lexSubstitution
 		case ':', 'b':
diff --git a/main/main.go b/main/main.go
index a506954..8e8c369 100644
--- a/main/main.go
+++ b/main/main.go
@@ -4,13 +4,13 @@ import (
 	"os"
 	"bufio"
 	"main/walk"
-	"main/json_array"
+	"main/json"
 )
 
 type Program []Command
 
 type ProgramState struct {
-	path, value, xreg, yreg, zreg []walk.Atom
+	path, value, xreg, yreg, zreg walk.ValueList
 	in walk.StredReader
 	out walk.StredWriter
 	program []Command
@@ -45,8 +45,8 @@ func main() {
 	stdout := bufio.NewWriter(os.Stdout)
 
 	state := ProgramState {
-		in: json_array.NewJSONArrayReader(stdin),
-		out: json_array.NewJSONArrayWriter(stdout),
+		in: json.NewJSONReader(stdin),
+		out: json.NewJSONWriter(stdout),
 		program: program,
 	}
 
diff --git a/main/parse.go b/main/parse.go
index cbbfb9a..141ae7e 100644
--- a/main/parse.go
+++ b/main/parse.go
@@ -71,61 +71,13 @@ func (p *parser) parseBasicCommand(commands []Command, commandChar rune) []Comma
 			return append(commands, NextCommand{})
 		case 'N':
 			return append(commands, AppendNextCommand{})
-		case 's', 'S', 'f', 'F', 'l', 'L', 'a', 'A':
+		case 's', 'S':
 			ast := p.parseSubex()
-			switch commandChar {
-				case 'f':
-					ast = subex.SubexASTConcat {
-						First: ast,
-						Second: subex.SubexASTRepeat {
-							Content: subex.SubexASTCopyAny{},
-							Acceptable: []subex.ConvexRange{{Start: -1, End: 0}},
-						},
-					}
-				case 'F':
-					ast = subex.SubexASTConcat {
-						First: subex.SubexASTStore {
-							Slot: '_',
-							Match: ast,
-						},
-						Second: subex.SubexASTRepeat {
-							Content: subex.SubexASTCopyAny{},
-							Acceptable: []subex.ConvexRange{{Start: -1, End: 0}},
-						},
-					}
-				case 'l':
-					ast = subex.SubexASTConcat {
-						First: subex.SubexASTRepeat {
-							Content: subex.SubexASTCopyAny{},
-							Acceptable: []subex.ConvexRange{{Start: 0, End: -1}},
-						},
-						Second: ast,
-					}
-				case 'L':
-					ast = subex.SubexASTConcat {
-						First: subex.SubexASTRepeat {
-							Content: subex.SubexASTCopyAny{},
-							Acceptable: []subex.ConvexRange{{Start: 0, End: -1}},
-						},
-						Second: subex.SubexASTStore {
-							Slot: '_',
-							Match: ast,
-						},
-					}
-				case 'a', 'A':
-					ast = subex.SubexASTRepeat {
-						Acceptable: []subex.ConvexRange{{Start: -1, End: 0}},
-						Content: subex.SubexASTOr {
-							First: ast,
-							Second: subex.SubexASTCopyAny{},
-						},
-					}
-			}
 			subex := subex.CompileTransducer(ast)
 			switch commandChar {
-				case 's', 'a':
+				case 's':
 					return append(commands, SubstituteValueCommand {subex}, JumpCommand {len(commands) + 3})
-				case 'S', 'f', 'F', 'l', 'L', 'A':
+				case 'S':
 					return append(commands, SubstitutePathCommand {subex}, JumpCommand {len(commands) + 3})
 				default:
 					panic("Unreachable!?!?")
-- 
cgit v1.2.3