From dae74317d84471f6a859117fcbba1cf546be8ea1 Mon Sep 17 00:00:00 2001 From: Charlie Stanton Date: Wed, 19 Apr 2023 15:19:42 +0100 Subject: Adds parsing substitute commands, though executing them currently does nothing --- main/parse.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'main/parse.go') diff --git a/main/parse.go b/main/parse.go index 73c7913..bf2f0ac 100644 --- a/main/parse.go +++ b/main/parse.go @@ -5,6 +5,7 @@ import ( "strconv" "fmt" "main/walk" + "main/subex" ) type parser struct { @@ -202,6 +203,25 @@ func (p *parser) parseLiterals() (items []walk.WalkItem) { return items } +func (p *parser) parseSubex() subex.SubexState { + delim := p.next() + if delim.typ != TokenSubstituteDelimiter { + panic("Missing substitute delimiter") + } + subexProgramToken := p.next() + if subexProgramToken.typ != TokenSubex { + panic("Missing subex from substitution") + } + reader := subex.NewStringRuneReader(subexProgramToken.val) + subexAST := subex.Parse(reader) + subex := subex.CompileTransducer(subexAST) + delim = p.next() + if delim.typ != TokenSubstituteDelimiter { + panic("Missing end substitute delimiter") + } + return subex +} + func (p *parser) parseBasicCommand(commandChar rune) Command { switch commandChar { case 'p': @@ -212,6 +232,9 @@ func (p *parser) parseBasicCommand(commandChar rune) Command { return NextCommand{} case 'N': return AppendNextCommand{} + case 's': + subex := p.parseSubex() + return SubstituteCommand {subex: subex} case 'i': items := p.parseLiterals() return PrintLiteralsCommand {items: items} -- cgit v1.2.3