diff options
| author | Charlie Stanton <charlie@shtanton.xyz> | 2024-03-29 17:38:33 +0000 | 
|---|---|---|
| committer | Charlie Stanton <charlie@shtanton.xyz> | 2024-03-29 17:38:33 +0000 | 
| commit | ad0cde67e01a54a138acf760642d62aedbfece46 (patch) | |
| tree | a0c680a93cb5042f89bb7552943fb210c4d6ae57 /subex | |
| parent | 080a24e894f125d4f1741cfdcba7cb722304d209 (diff) | |
| download | stred-go-ad0cde67e01a54a138acf760642d62aedbfece46.tar | |
Add basic array manipulation
Diffstat (limited to 'subex')
| -rw-r--r-- | subex/main_test.go | 113 | ||||
| -rw-r--r-- | subex/parse.go | 12 | ||||
| -rw-r--r-- | subex/subexast.go | 8 | 
3 files changed, 129 insertions, 4 deletions
| diff --git a/subex/main_test.go b/subex/main_test.go index 0b4ee1b..78a62c4 100644 --- a/subex/main_test.go +++ b/subex/main_test.go @@ -69,6 +69,119 @@ func TestSubexMain(t *testing.T) {  				walk.StringValue("ello"),  			},  		}, +		{ +			subex: "@(..$a`$a$a`{-0})@", +			input: []walk.Value { +				walk.ArrayValue { +					walk.ArrayElement { +						Index: 0, +						Value: walk.NullValue{}, +					}, +					walk.ArrayElement { +						Index: 0, +						Value: walk.BoolValue(true), +					}, +					walk.ArrayElement { +						Index: 0, +						Value: walk.NumberValue(5.4), +					}, +					walk.ArrayElement { +						Index: 5, +						Value: walk.StringValue("hello"), +					}, +					walk.ArrayElement { +						Index: 3, +						Value: walk.ArrayValue { +							walk.ArrayElement { +								Index: 0, +								Value: walk.NullValue{}, +							}, +						}, +					}, +					walk.ArrayElement { +						Index: 1, +						Value: walk.MapValue { +							walk.MapElement { +								Key: "key", +								Value: walk.StringValue("value"), +							}, +						}, +					}, +				}, +			}, +			expected: []walk.Value { +				walk.ArrayValue { +					walk.ArrayElement { +						Index: 0, +						Value: walk.NullValue{}, +					}, +					walk.ArrayElement { +						Index: 0, +						Value: walk.NullValue{}, +					}, +					walk.ArrayElement { +						Index: 0, +						Value: walk.BoolValue(true), +					}, +					walk.ArrayElement { +						Index: 0, +						Value: walk.BoolValue(true), +					}, +					walk.ArrayElement { +						Index: 0, +						Value: walk.NumberValue(5.4), +					}, +					walk.ArrayElement { +						Index: 0, +						Value: walk.NumberValue(5.4), +					}, +					walk.ArrayElement { +						Index: 5, +						Value: walk.StringValue("hello"), +					}, +					walk.ArrayElement { +						Index: 5, +						Value: walk.StringValue("hello"), +					}, +					walk.ArrayElement { +						Index: 3, +						Value: walk.ArrayValue { +							walk.ArrayElement { +								Index: 0, +								Value: walk.NullValue{}, +							}, +						}, +					}, +					walk.ArrayElement { +						Index: 3, +						Value: walk.ArrayValue { +							walk.ArrayElement { +								Index: 0, +								Value: walk.NullValue{}, +							}, +						}, +					}, +					walk.ArrayElement { +						Index: 1, +						Value: walk.MapValue { +							walk.MapElement { +								Key: "key", +								Value: walk.StringValue("value"), +							}, +						}, +					}, +					walk.ArrayElement { +						Index: 1, +						Value: walk.MapValue { +							walk.MapElement { +								Key: "key", +								Value: walk.StringValue("value"), +							}, +						}, +					}, +				}, +			}, +		},  	}  	for _, test := range tests { diff --git a/subex/parse.go b/subex/parse.go index fa98ecc..9602a4b 100644 --- a/subex/parse.go +++ b/subex/parse.go @@ -293,6 +293,18 @@ func parseSubex(l RuneReader, minPower int, inType Type, outType Type) SubexAST  				panic("Missing matching ~")  			}  			lhs = SubexASTEnterString {lhs} +		case '@': +			if !accept(l, "(") { +				panic("Missing ( after @") +			} +			lhs = parseSubex(l, 0, ValueType, ValueType) +			if !accept(l, ")") { +				panic("Missing matching )") +			} +			if !accept(l, "@") { +				panic("Missing matching ~") +			} +			lhs = SubexASTEnterArray {lhs}  		// TODO  		// case '[':  		// 	rangeParts := parseRangeSubex(l) diff --git a/subex/subexast.go b/subex/subexast.go index cc7313b..cef853b 100644 --- a/subex/subexast.go +++ b/subex/subexast.go @@ -472,10 +472,10 @@ func (ast SubexASTEnterArray) compileWith(next SubexState, slotMap *SlotMap, inT  		panic("Invalid types for SubexASTEnterArray")  	}  	return &SubexCaptureBeginState { -		next: &SubexIncrementNestState { -			next: &SubexCopyState { -				filter: anyArrayFilter{}, -				next: &SubexDiscardState { +		next: &SubexCopyState { +			filter: anyArrayFilter{}, +			next: &SubexDiscardState { +				next: &SubexIncrementNestState {  					next: &SubexCaptureBeginState {  						next: ast.Content.compileWith(  							&SubexDiscardTerminalState { | 
