From ce5c224211a94bfd4c898b51d15febdf2ed9d6f2 Mon Sep 17 00:00:00 2001 From: Charlie Stanton Date: Fri, 26 Aug 2022 11:51:46 +0100 Subject: Refactors some stuff and adds lexing and parsing --- main/filter.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) (limited to 'main/filter.go') diff --git a/main/filter.go b/main/filter.go index 95e6d82..662fa7b 100644 --- a/main/filter.go +++ b/main/filter.go @@ -3,10 +3,10 @@ package main type PathFilter struct { initial PathFilterState } -func (filter PathFilter) exec(state *ProgramState) bool { +func (filter PathFilter) exec(space WalkItem) bool { pathFilterState := make(map[PathFilterState]struct{}) pathFilterState[filter.initial] = struct{}{} - for _, segment := range state.space.path { + for _, segment := range space.path { nextPathFilterState := make(map[PathFilterState]struct{}) for curState := range pathFilterState { for nextState := range curState.eat(segment) { @@ -23,12 +23,58 @@ func (filter PathFilter) exec(state *ProgramState) bool { return false } +type MapTerminalFilter struct {} +func (filter MapTerminalFilter) exec(space WalkItem) bool { + terminal, isTerminal := space.value.(TerminalValue) + if !isTerminal { + return false + } + return terminal == MapBegin || terminal == MapEnd +} + +type NonTerminalFilter struct {} +func (filter NonTerminalFilter) exec(space WalkItem) bool { + _, isTerminal := space.value.(TerminalValue) + return !isTerminal +} + type RangeFilter struct { start Filter end Filter active bool } +func (filter *RangeFilter) exec(space WalkItem) bool { + if filter.active { + if filter.end.exec(space) { + filter.active = false + } + return true + } else { + if filter.start.exec(space) { + filter.active = true + } + return filter.active + } +} + +type BeginTerminalFilter struct {} +func (filter BeginTerminalFilter) exec(space WalkItem) bool { + terminal, isTerminal := space.value.(TerminalValue) + if !isTerminal { + return false + } + return terminal == ArrayBegin || terminal == MapBegin +} + +type EndTerminalFilter struct {} +func (filter EndTerminalFilter) exec(space WalkItem) bool { + terminal, isTerminal := space.value.(TerminalValue) + if !isTerminal { + return false + } + return terminal == ArrayEnd || terminal == MapEnd +} type Filter interface { - exec(*ProgramState) bool + exec(WalkItem) bool } \ No newline at end of file -- cgit v1.2.3