diff options
-rw-r--r-- | main/lex.go | 2 | ||||
-rw-r--r-- | main/parse.go | 14 |
2 files changed, 12 insertions, 4 deletions
diff --git a/main/lex.go b/main/lex.go index ecb0d3d..f28244d 100644 --- a/main/lex.go +++ b/main/lex.go @@ -179,7 +179,7 @@ func lexCommand(l *lexer) stateFunc { case '}': l.emit(TokenRBrace) return lexCommand - case 's', 'S', 'f', 'F', 'l', 'L': + case 's', 'S', 'f', 'F', 'l', 'L', 'a', 'A': l.emit(TokenCommand) return lexSubstitution } diff --git a/main/parse.go b/main/parse.go index 0c534e8..d31687a 100644 --- a/main/parse.go +++ b/main/parse.go @@ -69,7 +69,7 @@ func (p *parser) parseBasicCommand(commandChar rune) Command { return NextCommand{} case 'N': return AppendNextCommand{} - case 's', 'S', 'f', 'F', 'l', 'L': + case 's', 'S', 'f', 'F', 'l', 'L', 'a', 'A': ast := p.parseSubex() switch commandChar { case 'f': @@ -110,6 +110,14 @@ func (p *parser) parseBasicCommand(commandChar rune) Command { Match: ast, }, } + case 'a', 'A': + ast = subex.SubexASTRepeat { + Acceptable: []subex.ConvexRange{{Start: -1, End: 0}}, + Content: subex.SubexASTOr { + First: ast, + Second: subex.SubexASTCopyAny{}, + }, + } } subex := subex.CompileTransducer(ast) var next Command @@ -121,9 +129,9 @@ func (p *parser) parseBasicCommand(commandChar rune) Command { next = p.parseCommand() } switch commandChar { - case 's': + case 's', 'a': return SubstituteValueCommand {subex, next} - case 'S', 'f', 'F', 'l', 'L': + case 'S', 'f', 'F', 'l', 'L', 'A': return SubstitutePathCommand {subex, next} default: panic("Unreachable!?!?") |