several changes:
1. moved scan/symbol.go to new package sym and adapted all files that reference Symbol type and its values. 2. new type interval defined by begin, end and step values. 3. replaced operator-range.go with operator-interval.go. 4. replaced range operator begin:end with begin..end..step. 5. new implementation of sub-collection extraction based on new interval literal.
This commit is contained in:
+30
-29
@@ -7,6 +7,7 @@ package expr
|
||||
import (
|
||||
"git.portale-stac.it/go-pkg/expr/kern"
|
||||
"git.portale-stac.it/go-pkg/expr/scan"
|
||||
"git.portale-stac.it/go-pkg/expr/sym"
|
||||
"git.portale-stac.it/go-pkg/expr/types/array"
|
||||
"git.portale-stac.it/go-pkg/expr/types/dict"
|
||||
"git.portale-stac.it/go-pkg/expr/types/list"
|
||||
@@ -87,7 +88,7 @@ func assignCollectionItem(ctx kern.ExprContext, collectionTerm, keyListTerm *sca
|
||||
}
|
||||
|
||||
func assignValue(ctx kern.ExprContext, leftTerm *scan.Term, v any, deepCopy bool) (err error) {
|
||||
if leftTerm.Symbol() == scan.SymIndex {
|
||||
if leftTerm.Symbol() == sym.SymIndex {
|
||||
err = assignCollectionItem(ctx, leftTerm.Children[0], leftTerm.Children[1], v)
|
||||
} else {
|
||||
if deepCopy {
|
||||
@@ -118,7 +119,7 @@ func evalAssignDictItem(ctx kern.ExprContext, dotTerm *scan.Term, valueTerm kern
|
||||
|
||||
dotRightTerm := dotTerm.Children[1]
|
||||
dotRightSym := dotRightTerm.Symbol()
|
||||
if dotRightSym == scan.SymVariable || dotRightSym == scan.SymString {
|
||||
if dotRightSym == sym.SymVariable || dotRightSym == sym.SymString {
|
||||
dotKey = util.UnquoteString(dotRightTerm.Source())
|
||||
} else if dotKey, err = dotRightTerm.Compute(ctx); err != nil {
|
||||
return
|
||||
@@ -139,9 +140,9 @@ func generalEvalAssign(ctx kern.ExprContext, opTerm *scan.Term, deepCopy bool) (
|
||||
|
||||
leftTerm := opTerm.Children[0]
|
||||
leftSym := leftTerm.Symbol()
|
||||
if leftSym == scan.SymDot {
|
||||
if leftSym == sym.SymDot {
|
||||
return evalAssignDictItem(ctx, opTerm.Children[0], opTerm.GetChild(1))
|
||||
} else if leftSym != scan.SymVariable && leftSym != scan.SymIndex {
|
||||
} else if leftSym != sym.SymVariable && leftSym != sym.SymIndex {
|
||||
err = leftTerm.Tk.Errorf("left operand of %q must be a variable or a collection's item", opTerm.Tk.Source())
|
||||
return
|
||||
}
|
||||
@@ -150,7 +151,7 @@ func generalEvalAssign(ctx kern.ExprContext, opTerm *scan.Term, deepCopy bool) (
|
||||
|
||||
if v, err = rightChild.Compute(ctx); err == nil {
|
||||
if functor, ok := v.(kern.Functor); ok {
|
||||
if leftSym == scan.SymVariable {
|
||||
if leftSym == sym.SymVariable {
|
||||
if info := functor.GetFunc(); info != nil {
|
||||
ctx.RegisterFunc(leftTerm.Source(), info.Functor(), info.ReturnType(), info.Params())
|
||||
} else if funcDef, ok := functor.(*exprFunctor); ok {
|
||||
@@ -221,7 +222,7 @@ func getCollectionItemValue(ctx kern.ExprContext, collectionTerm, keyListTerm *s
|
||||
}
|
||||
|
||||
func getAssignValue(ctx kern.ExprContext, leftTerm *scan.Term) (value any, err error) {
|
||||
if leftTerm.Symbol() == scan.SymIndex {
|
||||
if leftTerm.Symbol() == sym.SymIndex {
|
||||
value, err = getCollectionItemValue(ctx, leftTerm.Children[0], leftTerm.Children[1])
|
||||
} else {
|
||||
value, _ = ctx.GetVar(leftTerm.Source())
|
||||
@@ -237,7 +238,7 @@ func evalOpAssign(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error) {
|
||||
|
||||
leftTerm := opTerm.Children[0]
|
||||
leftSym := leftTerm.Symbol()
|
||||
if leftSym != scan.SymVariable && leftSym != scan.SymIndex {
|
||||
if leftSym != sym.SymVariable && leftSym != sym.SymIndex {
|
||||
err = leftTerm.Tk.Errorf("left operand of %q must be a variable or a collection's item", opTerm.Tk.Source())
|
||||
return
|
||||
}
|
||||
@@ -247,25 +248,25 @@ func evalOpAssign(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error) {
|
||||
if rightValue, err = rightChild.Compute(ctx); err == nil {
|
||||
if leftValue, err = getAssignValue(ctx, leftTerm); err == nil {
|
||||
switch opTerm.Symbol() {
|
||||
case scan.SymPlusEqual:
|
||||
case sym.SymPlusEqual:
|
||||
v, err = sumValues(opTerm, leftValue, rightValue)
|
||||
case scan.SymMinusEqual:
|
||||
case sym.SymMinusEqual:
|
||||
v, err = diffValues(opTerm, leftValue, rightValue)
|
||||
case scan.SymStarEqual:
|
||||
case sym.SymStarEqual:
|
||||
v, err = mulValues(opTerm, leftValue, rightValue)
|
||||
case scan.SymSlashEqual:
|
||||
case sym.SymSlashEqual:
|
||||
v, err = divValues(opTerm, leftValue, rightValue)
|
||||
case scan.SymPercEqual:
|
||||
case sym.SymPercEqual:
|
||||
v, err = remainderValues(opTerm, leftValue, rightValue)
|
||||
case scan.SymAmpersandEqual:
|
||||
case sym.SymAmpersandEqual:
|
||||
v, err = bitwiseAnd(opTerm, leftValue, rightValue)
|
||||
case scan.SymVertBarEqual:
|
||||
case sym.SymVertBarEqual:
|
||||
v, err = bitwiseOr(opTerm, leftValue, rightValue)
|
||||
case scan.SymCaretEqual:
|
||||
case sym.SymCaretEqual:
|
||||
v, err = bitwiseXor(opTerm, leftValue, rightValue)
|
||||
case scan.SymDoubleLessEqual:
|
||||
case sym.SymDoubleLessEqual:
|
||||
v, err = bitLeftShift(opTerm, leftValue, rightValue)
|
||||
case scan.SymDoubleGreaterEqual:
|
||||
case sym.SymDoubleGreaterEqual:
|
||||
v, err = bitRightShift(opTerm, leftValue, rightValue)
|
||||
default:
|
||||
err = opTerm.Errorf("unsupported assign operator %q", opTerm.Source())
|
||||
@@ -280,16 +281,16 @@ func evalOpAssign(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error) {
|
||||
|
||||
// init
|
||||
func init() {
|
||||
scan.RegisterTermConstructor(scan.SymEqual, newAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymColonEqual, newDeepCopyAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymPlusEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymMinusEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymStarEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymSlashEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymPercEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymDoubleLessEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymDoubleGreaterEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymAmpersandEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymVertBarEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(scan.SymCaretEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymEqual, newAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymColonEqual, newDeepCopyAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymPlusEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymMinusEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymStarEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymSlashEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymPercEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymDoubleLessEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymDoubleGreaterEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymAmpersandEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymVertBarEqual, newOpAssignTerm)
|
||||
scan.RegisterTermConstructor(sym.SymCaretEqual, newOpAssignTerm)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user