diff options
| author | Charlie Stanton <charlie@shtanton.xyz> | 2024-03-29 09:49:26 +0000 | 
|---|---|---|
| committer | Charlie Stanton <charlie@shtanton.xyz> | 2024-03-29 09:49:26 +0000 | 
| commit | 080a24e894f125d4f1741cfdcba7cb722304d209 (patch) | |
| tree | 78c12af110a8a239b6a3b1f828e4f193fcb8cd32 /main | |
| parent | 510a8c95ce112617c33f8dfb865e752db0716cb1 (diff) | |
| download | stred-go-080a24e894f125d4f1741cfdcba7cb722304d209.tar | |
Completely remove the path space
The new design uses deeply nested values in the value space instead.
Diffstat (limited to 'main')
| -rw-r--r-- | main/command.go | 66 | ||||
| -rw-r--r-- | main/main.go | 20 | ||||
| -rw-r--r-- | main/parse.go | 17 | 
3 files changed, 19 insertions, 84 deletions
| diff --git a/main/command.go b/main/command.go index 5a898e2..1d089ee 100644 --- a/main/command.go +++ b/main/command.go @@ -13,12 +13,11 @@ type Command interface {  type PrintValueCommand struct {}  func (cmd PrintValueCommand) exec(state *ProgramState) { -	err := state.out.Write(walk.WalkItem { -		Path: state.path, -		Value: state.value, -	}) -	if err != nil { -		panic("Error while outputting") +	for _, value := range state.value { +		err := state.out.Write(value) +		if err != nil { +			panic("Error while outputting") +		}  	}  	state.pc++  } @@ -32,8 +31,7 @@ func (cmd NextCommand) exec(state *ProgramState) {  	if err != nil {  		panic("Missing next value")  	} -	state.value = nextItem.Value -	state.path = nextItem.Path +	state.value = []walk.Value{nextItem.Value}  	state.pc++  }  func (cmd NextCommand) String() string { @@ -46,8 +44,7 @@ func (cmd AppendNextCommand) exec(state *ProgramState) {  	if err != nil {  		panic("Missing next value")  	} -	state.value = append(state.value, nextItem.Value...) -	state.path = nextItem.Path +	state.value = append(state.value, nextItem.Value)  	state.pc++  }  func (cmd AppendNextCommand) String() string { @@ -63,16 +60,7 @@ func (cmd DeleteValueCommand) String() string {  	return "d"  } -type DeletePathCommand struct {} -func (cmd DeletePathCommand) exec(state *ProgramState) { -	state.path = nil -	state.pc++ -} -func (cmd DeletePathCommand) String() string { -	return "D" -} - -func runSubex(state subex.Transducer, in walk.ValueList) (walk.ValueList, bool) { +func runSubex(state subex.Transducer, in []walk.Value) ([]walk.Value, bool) {  	out, error := subex.RunTransducer(state, in)  	if error {  		return nil, true @@ -96,22 +84,6 @@ func (cmd SubstituteValueCommand) String() string {  	return "s/.../"  } -type SubstitutePathCommand struct { -	subex subex.Transducer -} -func (cmd SubstitutePathCommand) exec(state *ProgramState) { -	newPath, err := runSubex(cmd.subex, state.path) -	if err { -		state.pc++ -	} else { -		state.pc += 2 -		state.path = newPath -	} -} -func (cmd SubstitutePathCommand) String() string { -	return "S/.../" -} -  type NoopCommand struct {}  func (cmd NoopCommand) exec(state *ProgramState) {  	state.pc++ @@ -180,26 +152,6 @@ func (cmd AppendZRegCommand) String() string {  	return "Z"  } -type SwapPathCommand struct {} -func (cmd SwapPathCommand) exec(state *ProgramState) { -	v := state.value -	state.value = state.path -	state.path = v -	state.pc++ -} -func (cmd SwapPathCommand) String() string { -	return "k" -} - -type AppendPathCommand struct {} -func (cmd AppendPathCommand) exec(state *ProgramState) { -	state.path = append(state.path, state.value...) -	state.pc++ -} -func (cmd AppendPathCommand) String() string { -	return "K" -} -  type JumpCommand struct {  	destination int  } @@ -220,4 +172,4 @@ func (cmd BranchPlaceholderCommand) exec(state *ProgramState) {  }  func (cmd BranchPlaceholderCommand) String() string {  	return fmt.Sprintf("b%c", cmd.label) -}
\ No newline at end of file +} diff --git a/main/main.go b/main/main.go index 8e8c369..b7ef568 100644 --- a/main/main.go +++ b/main/main.go @@ -7,10 +7,8 @@ import (  	"main/json"  ) -type Program []Command -  type ProgramState struct { -	path, value, xreg, yreg, zreg walk.ValueList +	value, xreg, yreg, zreg []walk.Value  	in walk.StredReader  	out walk.StredWriter  	program []Command @@ -55,23 +53,21 @@ func main() {  		if err != nil {  			break  		} -		state.value = walkItem.Value -		state.path = walkItem.Path +		state.value = []walk.Value{walkItem.Value}  		state.pc = 0  		for state.pc < len(state.program) {  			state.program[state.pc].exec(&state)  		}  		if !quiet { -			err := state.out.Write(walk.WalkItem { -				Path: state.path, -				Value: state.value, -			}) -			if err != nil { -				panic("Error while outputting") +			for _, value := range state.value { +				err := state.out.Write(value) +				if err != nil { +					panic("Error while outputting") +				}  			}  		}  	}  	state.in.AssertDone()  	state.out.AssertDone() -}
\ No newline at end of file +} diff --git a/main/parse.go b/main/parse.go index 141ae7e..9c7a437 100644 --- a/main/parse.go +++ b/main/parse.go @@ -65,23 +65,14 @@ func (p *parser) parseBasicCommand(commands []Command, commandChar rune) []Comma  			return append(commands, PrintValueCommand{})  		case 'd':  			return append(commands, DeleteValueCommand{}) -		case 'D': -			return append(commands, DeletePathCommand{})  		case 'n':  			return append(commands, NextCommand{})  		case 'N':  			return append(commands, AppendNextCommand{}) -		case 's', 'S': +		case 's':  			ast := p.parseSubex()  			subex := subex.CompileTransducer(ast) -			switch commandChar { -				case 's': -					return append(commands, SubstituteValueCommand {subex}, JumpCommand {len(commands) + 3}) -				case 'S': -					return append(commands, SubstitutePathCommand {subex}, JumpCommand {len(commands) + 3}) -				default: -					panic("Unreachable!?!?") -			} +			return append(commands, SubstituteValueCommand {subex}, JumpCommand {len(commands) + 3})  		case 'o':  			return append(commands, NoopCommand{})  		case 'x': @@ -96,10 +87,6 @@ func (p *parser) parseBasicCommand(commands []Command, commandChar rune) []Comma  			return append(commands, SwapZRegCommand{})  		case 'Z':  			return append(commands, AppendZRegCommand{}) -		case 'k': -			return append(commands, SwapPathCommand{}) -		case 'K': -			return append(commands, AppendPathCommand{})  		case ':':  			labelToken := p.next()  			if labelToken.typ != TokenLabel { | 
