<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
path: root/subex
diff options
context:
space:
mode:
Diffstat (limited to 'subex')
-rw-r--r--subex/parse.go25
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