changed the structer of the selector components: now all case are a list value assigned as right operand of the selector operator

This commit is contained in:
2024-04-13 10:10:25 +02:00
parent efd9af9030
commit 70cdb9367e
4 changed files with 119 additions and 13 deletions
+20 -7
View File
@@ -154,6 +154,19 @@ func (self *parser) parseSelectorCase(scanner *scanner, allowVarRef bool, defaul
return
}
func addSelectorCase(selectorTerm, caseTerm *term) {
if len(selectorTerm.children) < 2 {
caseListTerm := newListTermA(caseTerm)
selectorTerm.children = append(selectorTerm.children, caseListTerm)
} else {
caseListTerm := selectorTerm.children[1]
caseList, _ := caseListTerm.value().([]*term)
caseList = append(caseList, caseTerm)
caseListTerm.tk.Value = caseList
}
caseTerm.parent = selectorTerm
}
func (self *parser) parseSelector(scanner *scanner, tree *ast, allowVarRef bool) (selectorTerm *term, err error) {
var caseTerm *term
tk := scanner.makeToken(SymSelector, '?')
@@ -162,8 +175,9 @@ func (self *parser) parseSelector(scanner *scanner, tree *ast, allowVarRef bool)
}
if caseTerm, err = self.parseSelectorCase(scanner, allowVarRef, false); err == nil {
selectorTerm.children = append(selectorTerm.children, caseTerm)
caseTerm.parent = selectorTerm
addSelectorCase(selectorTerm, caseTerm)
// selectorTerm.children = append(selectorTerm.children, caseTerm)
// caseTerm.parent = selectorTerm
}
return
}
@@ -246,9 +260,7 @@ func (self *parser) parseGeneral(scanner *scanner, allowForest bool, allowVarRef
currentTerm, err = tree.addToken2(tk)
}
case SymQuestion:
/*if selectorTerm != nil {
err = tk.Errorf("nested selectors must be enclosed in parentheses")
} else*/if selectorTerm, err = self.parseSelector(scanner, tree, allowVarRef); err == nil {
if selectorTerm, err = self.parseSelector(scanner, tree, allowVarRef); err == nil {
currentTerm = selectorTerm
}
case SymColon, SymDoubleColon:
@@ -256,8 +268,9 @@ func (self *parser) parseGeneral(scanner *scanner, allowForest bool, allowVarRef
if selectorTerm == nil {
err = tk.Errorf("selector-case outside of a selector context")
} else if caseTerm, err = self.parseSelectorCase(scanner, allowVarRef, tk.Sym == SymDoubleColon); err == nil {
selectorTerm.children = append(selectorTerm.children, caseTerm)
caseTerm.parent = selectorTerm
// selectorTerm.children = append(selectorTerm.children, caseTerm)
// caseTerm.parent = selectorTerm
addSelectorCase(selectorTerm, caseTerm)
currentTerm = caseTerm
if tk.Sym == SymDoubleColon {
selectorTerm = nil