<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
path: root/subex/subexstate.go
diff options
context:
space:
mode:
authorCharlie Stanton <charlie@shtanton.xyz>2023-04-21 09:53:04 +0100
committerCharlie Stanton <charlie@shtanton.xyz>2023-04-21 09:53:04 +0100
commitf1e5bc37723a4faa30bbfeed392c31489914eb50 (patch)
tree3515317bfd9a509d4bef0392ec0cbf3da35d71eb /subex/subexstate.go
parent3cb886859e9b4df4ece183583dfd8b5ba7a59584 (diff)
downloadstred-go-f1e5bc37723a4faa30bbfeed392c31489914eb50.tar
Add subex syntax to copy across booleans, numbers, strings and values
Diffstat (limited to 'subex/subexstate.go')
-rw-r--r--subex/subexstate.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/subex/subexstate.go b/subex/subexstate.go
index cca7a88..997e6ce 100644
--- a/subex/subexstate.go
+++ b/subex/subexstate.go
@@ -135,6 +135,83 @@ func (state SubexCopyAtomState) accepting(store Store, outputStack OutputStack)
return nil
}
+// Read in a boolean atom and output it
+type SubexCopyBoolState struct {
+ next SubexState
+}
+func (state SubexCopyBoolState) eat(store Store, outputStack OutputStack, char walk.Atom) []SubexBranch {
+ _, isBool := char.(walk.ValueBool)
+ if isBool {
+ return []SubexBranch{{
+ state: state.next,
+ outputStack: topAppend(outputStack, []walk.Atom{char}),
+ store: store,
+ }}
+ }
+ return nil
+}
+func (state SubexCopyBoolState) accepting(store Store, outputStack OutputStack) []OutputStack {
+ return nil
+}
+
+// Read in a number atom and output it
+type SubexCopyNumberState struct {
+ next SubexState
+}
+func (state SubexCopyNumberState) eat(store Store, outputStack OutputStack, char walk.Atom) []SubexBranch {
+ _, isNumber := char.(walk.ValueNumber)
+ if isNumber {
+ return []SubexBranch{{
+ state: state.next,
+ outputStack: topAppend(outputStack, []walk.Atom{char}),
+ store: store,
+ }}
+ }
+ return nil
+}
+func (state SubexCopyNumberState) accepting(store Store, outputStack OutputStack) []OutputStack {
+ return nil
+}
+
+// Read in a string atom and output it
+type SubexCopyStringAtomState struct {
+ next SubexState
+}
+func (state SubexCopyStringAtomState) eat(store Store, outputStack OutputStack, char walk.Atom) []SubexBranch {
+ _, isStringAtom := char.(walk.StringAtom)
+ if isStringAtom {
+ return []SubexBranch{{
+ state: state.next,
+ outputStack: topAppend(outputStack, []walk.Atom{char}),
+ store: store,
+ }}
+ }
+ return nil
+}
+func (state SubexCopyStringAtomState) accepting(store Store, outputStack OutputStack) []OutputStack {
+ return nil
+}
+
+// Read in an atom and copy it out as long as it is not part of a string
+type SubexCopyNonStringAtomState struct {
+ next SubexState
+}
+func (state SubexCopyNonStringAtomState) eat(store Store, outputStack OutputStack, char walk.Atom) []SubexBranch {
+ _, isStringAtom := char.(walk.StringAtom)
+ _, isStringTerminal := char.(walk.StringTerminal)
+ if isStringAtom || isStringTerminal {
+ return nil
+ }
+ return []SubexBranch{{
+ state: state.next,
+ outputStack: topAppend(outputStack, []walk.Atom{char}),
+ store: store,
+ }}
+}
+func (state SubexCopyNonStringAtomState) accepting(store Store, outputStack OutputStack) []OutputStack {
+ return nil
+}
+
// Read in any Atom and output it
type SubexCopyAnyState struct {
next SubexState