diff options
| author | Charlie Stanton <charlie@shtanton.xyz> | 2023-04-20 12:33:04 +0100 | 
|---|---|---|
| committer | Charlie Stanton <charlie@shtanton.xyz> | 2023-04-20 12:33:04 +0100 | 
| commit | db8800dcdac60a48ef4a4f084940581222e643ad (patch) | |
| tree | e2fa532501fbe03fec801262b4e286d4a8323a24 | |
| parent | 3d5730276b8866c3458f163f3050fe2daea259e3 (diff) | |
| download | stred-go-db8800dcdac60a48ef4a4f084940581222e643ad.tar | |
Replaces the start and end terminals of strings with a single terminal, with " as a literal for it
| -rw-r--r-- | subex/parse.go | 12 | ||||
| -rw-r--r-- | walk/walk.go | 21 | 
2 files changed, 17 insertions, 16 deletions
| diff --git a/subex/parse.go b/subex/parse.go index 9e47e0b..b1d54ac 100644 --- a/subex/parse.go +++ b/subex/parse.go @@ -39,7 +39,7 @@ func parseTerminatorAtomLiteral(termType rune, l RuneReader) walk.Atom {  		case '@':  			return expectBracket(l, walk.ArrayBegin, walk.ArrayEnd)  		case '~': -			return expectBracket(l, walk.StartString{}, walk.EndString{}) +			return expectBracket(l, walk.StringTerminal{}, walk.StringTerminal{})  		case '#':  			return expectBracket(l, walk.MapBegin, walk.MapEnd)  		default: @@ -193,6 +193,8 @@ func parseReplacement(l RuneReader) (output []OutputContent) {  				for _, literal := range literals {  					output = append(output, OutputAtomLiteral {literal})  				} +			case '"': +				output = append(output, OutputAtomLiteral {walk.StringTerminal{}})  			default:  				output = append(output, OutputAtomLiteral{atom: walk.StringAtom(r)})  		} @@ -218,6 +220,9 @@ func parseRangeSubex(l RuneReader) map[walk.Atom]walk.Atom {  			literals := parseNonStringLiteral(l)  			froms = append(froms, literals...)  			continue +		} else if fromsStart == '"' { +			froms = append(froms, walk.StringTerminal{}) +			continue  		} else {  			atom := parseTerminatorAtomLiteral(fromsStart, l)  			if atom != nil { @@ -252,6 +257,9 @@ func parseRangeSubex(l RuneReader) map[walk.Atom]walk.Atom {  				literals := parseNonStringLiteral(l)  				tos = append(tos, literals...)  				continue +			} else if tosStart == '"' { +				tos = append(tos, walk.StringTerminal{}) +				continue  			} else {  				atom := parseTerminatorAtomLiteral(tosStart, l)  				if atom != nil { @@ -307,6 +315,8 @@ func parseSubex(l RuneReader, minPower int) SubexAST {  			lhs = SubexASTOutput{replacement}  		case '.':  			lhs = SubexASTCopyAny{} +		case '"': +			lhs = SubexASTCopyAtom {walk.StringTerminal{}}  		case '@', '#', '~':  			lhs = SubexASTCopyAtom{atom: parseTerminatorAtomLiteral(r, l)}  		case '`': diff --git a/walk/walk.go b/walk/walk.go index 72fbe11..5c1ca75 100644 --- a/walk/walk.go +++ b/walk/walk.go @@ -99,22 +99,19 @@ func (value ValueNumber) String() string {  }  func (value ValueNumber) atomness() {} -type StartString struct {} -func (value StartString) atomness() {} - -type EndString struct {} -func (value EndString) atomness() {} +type StringTerminal struct {} +func (value StringTerminal) atomness() {}  type StringAtom rune  func (value StringAtom) atomness() {}  type ValueString string  func (value ValueString) Pieces(out chan<- Atom) { -	out<-StartString{} +	out<-StringTerminal{}  	for _, char := range value {  		out<-StringAtom(char)  	} -	out<-EndString{} +	out<-StringTerminal{}  }  func (value ValueString) String() string {  	return fmt.Sprintf("\"%s\"", string(value)) @@ -456,7 +453,6 @@ type CompoundError int  const (  	CompoundRuneOutsideString CompoundError = iota -	CompoundEndStringOutsideString  	CompoundUnknownAtom  	CompoundMissingEnd  	CompoundInvalidStringAtom @@ -466,8 +462,6 @@ func (err CompoundError) Error() string {  	switch err {  		case CompoundRuneOutsideString:  			return "Compound Error: Rune Outside String" -		case CompoundEndStringOutsideString: -			return "Compound Error: End String Outside String"  		case CompoundUnknownAtom:  			return "Compound Error: Unknown Atom"  		case CompoundMissingEnd: @@ -508,10 +502,7 @@ func Compound(in <-chan Atom) <-chan CompoundResult {  				case StringAtom:  					out<-CompoundResult{nil, CompoundRuneOutsideString}  					break outer -				case EndString: -					out<-CompoundResult{nil, CompoundEndStringOutsideString} -					break outer -				case StartString: +				case StringTerminal:  				default:  					out<-CompoundResult{nil, CompoundUnknownAtom}  					break outer @@ -525,7 +516,7 @@ func Compound(in <-chan Atom) <-chan CompoundResult {  					break outer  				}  				switch v := atom.(type) { -					case EndString: +					case StringTerminal:  						break loop  					case StringAtom:  						builder.WriteRune(rune(v)) | 
