diff options
author | EuAndreh <eu@euandre.org> | 2024-12-11 16:26:16 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-12-11 16:26:21 -0300 |
commit | 38f4733efc322f10eda7800259a95d682139592a (patch) | |
tree | e34e46a0ff17218fedd724e3ebd8eff477190fa3 /src/urubu/grammar/lexical/parser/fragment.go | |
parent | rm LICENSE (diff) | |
download | cotia-38f4733efc322f10eda7800259a95d682139592a.tar.gz cotia-38f4733efc322f10eda7800259a95d682139592a.tar.xz |
Consolidate packages spread across multiple files into single one
Diffstat (limited to 'src/urubu/grammar/lexical/parser/fragment.go')
-rw-r--r-- | src/urubu/grammar/lexical/parser/fragment.go | 72 |
1 files changed, 0 insertions, 72 deletions
diff --git a/src/urubu/grammar/lexical/parser/fragment.go b/src/urubu/grammar/lexical/parser/fragment.go deleted file mode 100644 index 196c00b..0000000 --- a/src/urubu/grammar/lexical/parser/fragment.go +++ /dev/null @@ -1,72 +0,0 @@ -package parser - -import ( - "fmt" - - spec "urubu/spec/grammar" -) - -type incompleteFragment struct { - kind spec.LexKindName - root *rootNode -} - -func CompleteFragments(fragments map[spec.LexKindName]CPTree) error { - if len(fragments) == 0 { - return nil - } - - completeFragments := map[spec.LexKindName]CPTree{} - incompleteFragments := []*incompleteFragment{} - for kind, tree := range fragments { - root, ok := tree.(*rootNode) - if !ok { - return fmt.Errorf("CompleteFragments can take only *rootNode: %T", tree) - } - if root.incomplete() { - incompleteFragments = append(incompleteFragments, &incompleteFragment{ - kind: kind, - root: root, - }) - } else { - completeFragments[kind] = root - } - } - for len(incompleteFragments) > 0 { - lastIncompCount := len(incompleteFragments) - remainingFragments := []*incompleteFragment{} - for _, e := range incompleteFragments { - complete, err := ApplyFragments(e.root, completeFragments) - if err != nil { - return err - } - if !complete { - remainingFragments = append(remainingFragments, e) - } else { - completeFragments[e.kind] = e.root - } - } - incompleteFragments = remainingFragments - if len(incompleteFragments) == lastIncompCount { - return ParseErr - } - } - - return nil -} - -func ApplyFragments(t CPTree, fragments map[spec.LexKindName]CPTree) (bool, error) { - root, ok := t.(*rootNode) - if !ok { - return false, fmt.Errorf("ApplyFragments can take only *rootNode type: %T", t) - } - - for name, frag := range fragments { - err := root.applyFragment(name, frag) - if err != nil { - return false, err - } - } - - return !root.incomplete(), nil -} |