diff options
-rw-r--r-- | main/parse.go | 2 | ||||
-rw-r--r-- | subex/parse.go | 25 |
2 files changed, 19 insertions, 8 deletions
diff --git a/main/parse.go b/main/parse.go index dc86fd6..0c534e8 100644 --- a/main/parse.go +++ b/main/parse.go @@ -43,7 +43,7 @@ func (p *parser) parseSubex() subex.SubexAST { panic("Missing subex from substitution") } var subexProgram string - if delim.val == "=" || delim.val == "~" || delim.val == "\"" || delim.val == "`" { + if delim.val == "=" || delim.val == "~" || delim.val == "\"" || delim.val == "`" || delim.val == "^" { subexProgram = delim.val + subexProgramToken.val + delim.val } else { subexProgram = subexProgramToken.val 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 |