From f1e5bc37723a4faa30bbfeed392c31489914eb50 Mon Sep 17 00:00:00 2001 From: Charlie Stanton Date: Fri, 21 Apr 2023 09:53:04 +0100 Subject: Add subex syntax to copy across booleans, numbers, strings and values --- subex/subexast.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'subex/subexast.go') diff --git a/subex/subexast.go b/subex/subexast.go index 87686b1..baf7a3b 100644 --- a/subex/subexast.go +++ b/subex/subexast.go @@ -134,6 +134,55 @@ func (ast SubexASTCopyAtom) compileWith(next SubexState) SubexState { } } +// Read in a single atom that must be a boolean and output it unchanged +type SubexASTCopyBool struct {} +func (ast SubexASTCopyBool) compileWith(next SubexState) SubexState { + return &SubexCopyBoolState {next} +} + +// Read in a single atom that must be a number and output it unchanged +type SubexASTCopyNumber struct {} +func (ast SubexASTCopyNumber) compileWith(next SubexState) SubexState { + return &SubexCopyNumberState {next} +} + +// Read in a single atom that must be a string atom and output it unchanged +type SubexASTCopyStringAtom struct {} +func (ast SubexASTCopyStringAtom) compileWith(next SubexState) SubexState { + return &SubexCopyStringAtomState {next} +} + +// Read in a full string value and copy it out unchanged +// # is equivalent to "_{-0}" +type SubexASTCopyString struct {} +func (ast SubexASTCopyString) compileWith(next SubexState) SubexState { + stringAtomState := &SubexCopyStringAtomState { + next: nil, + } + stringContentState := &SubexGroupState { + &SubexCopyAtomState { + atom: walk.StringTerminal{}, + next: next, + }, + stringAtomState, + } + stringAtomState.next = stringContentState + return &SubexCopyAtomState { + atom: walk.StringTerminal{}, + next: stringContentState, + } +} + +// Read in a value and copy it out unchanged +// , is equivalent to `null`|?|%|#|[`{}[]`] +type SubexASTCopyValue struct {} +func (ast SubexASTCopyValue) compileWith(next SubexState) SubexState { + return &SubexGroupState { + SubexASTCopyString{}.compileWith(next), + &SubexCopyNonStringAtomState {next}, + } +} + // Read in any single Atom and output it unchanged type SubexASTCopyAny struct {} func (ast SubexASTCopyAny) compileWith(next SubexState) SubexState { -- cgit v1.2.3