<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorCharlie Stanton <charlie@shtanton.xyz>2023-07-19 11:57:59 +0100
committerCharlie Stanton <charlie@shtanton.xyz>2023-07-19 11:57:59 +0100
commit8cf10efe3b5a1bcc70bc6e5590ee63fd5eb00c5b (patch)
tree7a16883c17c2bdcc49b2f9d4f333dfc76c66248f /main
parent3c34366bdd5d817a184d6b1c901d03a16b6faa4b (diff)
downloadstred-go-8cf10efe3b5a1bcc70bc6e5590ee63fd5eb00c5b.tar
Huge refactor to a more value based system, doing away with terminals. Also introduces unit testing
Diffstat (limited to 'main')
-rw-r--r--main/command.go12
-rw-r--r--main/lex.go2
-rw-r--r--main/main.go8
-rw-r--r--main/parse.go54
4 files changed, 14 insertions, 62 deletions
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!?!?")