diff options
Diffstat (limited to 'subex/parse.go')
-rw-r--r-- | subex/parse.go | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/subex/parse.go b/subex/parse.go index 106663d..b403adc 100644 --- a/subex/parse.go +++ b/subex/parse.go @@ -166,7 +166,7 @@ func parseReplacement(l RuneReader) (output []OutputContent) { switch r { case eof: panic("Missing closing \"") - case '=': + case '=', '^': break loop case '$': slot := l.Next() @@ -287,6 +287,23 @@ func parseSubex(l RuneReader, minPower int) SubexAST { case '=': replacement := parseReplacement(l) lhs = SubexASTOutput{replacement} + case '`': + literals := parseNonStringLiteral(l) + lhs = SubexASTEmpty{} + for _, literal := range literals { + lhs = SubexASTConcat {lhs, SubexASTCopyAtom {literal}} + } + case '^': + replacement := parseReplacement(l) + replacement = append( + []OutputContent{OutputAtomLiteral {walk.StringTerminal{}}}, + replacement... + ) + replacement = append( + replacement, + OutputAtomLiteral {walk.StringTerminal{}}, + ) + lhs = SubexASTOutput {replacement} case '.': lhs = SubexASTCopyAny{} case '?': @@ -301,12 +318,6 @@ func parseSubex(l RuneReader, minPower int) SubexAST { lhs = SubexASTCopyValue{} case '"': lhs = SubexASTCopyAtom {walk.StringTerminal{}} - case '`': - literals := parseNonStringLiteral(l) - lhs = SubexASTEmpty{} - for _, literal := range literals { - lhs = SubexASTConcat {lhs, SubexASTCopyAtom {literal}} - } case '~': literals := parseNonStringLiteral(l) var replacement []OutputContent |