aboutsummaryrefslogtreecommitdiff
path: root/compiler/parser/fragment.go
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2024-11-29 16:53:50 -0300
committerEuAndreh <eu@euandre.org>2024-11-29 16:53:50 -0300
commitb987d9ec5b7f73aa90ab8d966c313ef34ce150ef (patch)
treea678c49e609d241e70f63e65e563bd3028c01865 /compiler/parser/fragment.go
parentrm example/* (diff)
downloadtre-b987d9ec5b7f73aa90ab8d966c313ef34ce150ef.tar.gz
tre-b987d9ec5b7f73aa90ab8d966c313ef34ce150ef.tar.xz
Absorb compiler/parser/
Diffstat (limited to '')
-rw-r--r--compiler/parser/fragment.go72
1 files changed, 0 insertions, 72 deletions
diff --git a/compiler/parser/fragment.go b/compiler/parser/fragment.go
deleted file mode 100644
index 5680b55..0000000
--- a/compiler/parser/fragment.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package parser
-
-import (
- "fmt"
-
- "github.com/nihei9/maleeni/spec"
-)
-
-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
-}