Added virtual symbol SymVariable translated from general real SymIdentifier symbol

This commit is contained in:
Celestino Amoroso 2024-05-20 06:05:24 +02:00
parent e5c5920db0
commit 7c8dbb0ac7
7 changed files with 12 additions and 32 deletions

View File

@ -8,7 +8,7 @@ import "fmt"
// -------- variable term // -------- variable term
func newVarTerm(tk *Token) *term { func newVarTerm(tk *Token) *term {
return &term{ t := &term{
tk: *tk, tk: *tk,
// class: classVar, // class: classVar,
// kind: kindUnknown, // kind: kindUnknown,
@ -18,6 +18,8 @@ func newVarTerm(tk *Token) *term {
priority: priValue, priority: priValue,
evalFunc: evalVar, evalFunc: evalVar,
} }
t.tk.Sym = SymVariable
return t
} }
// -------- eval func // -------- eval func

View File

@ -22,7 +22,7 @@ func evalAssign(ctx ExprContext, self *term) (v any, err error) {
} }
leftTerm := self.children[0] leftTerm := self.children[0]
if leftTerm.tk.Sym != SymIdentifier { if leftTerm.tk.Sym != SymVariable {
err = leftTerm.tk.Errorf("left operand of %q must be a variable", self.tk.source) err = leftTerm.tk.Errorf("left operand of %q must be a variable", self.tk.source)
return return
} }

View File

@ -9,8 +9,6 @@ package expr
func newNullCoalesceTerm(tk *Token) (inst *term) { func newNullCoalesceTerm(tk *Token) (inst *term) {
return &term{ return &term{
tk: *tk, tk: *tk,
// class: classOperator,
// kind: kindUnknown,
children: make([]*term, 0, 2), children: make([]*term, 0, 2),
position: posInfix, position: posInfix,
priority: priCoalesce, priority: priCoalesce,
@ -26,7 +24,7 @@ func evalNullCoalesce(ctx ExprContext, self *term) (v any, err error) {
} }
leftTerm := self.children[0] leftTerm := self.children[0]
if leftTerm.tk.Sym != SymIdentifier { if leftTerm.tk.Sym != SymVariable {
err = leftTerm.Errorf("left operand of %q must be a variable", self.tk.source) err = leftTerm.Errorf("left operand of %q must be a variable", self.tk.source)
return return
} }
@ -34,11 +32,7 @@ func evalNullCoalesce(ctx ExprContext, self *term) (v any, err error) {
if leftValue, exists := ctx.GetVar(leftTerm.source()); exists { if leftValue, exists := ctx.GetVar(leftTerm.source()); exists {
v = leftValue v = leftValue
} else if rightValue, err = self.children[1].compute(ctx); err == nil { } else if rightValue, err = self.children[1].compute(ctx); err == nil {
// if _, ok := rightValue.(Functor); ok {
// err = errCoalesceNoFunc(self.children[1])
// } else {
v = rightValue v = rightValue
// }
} }
return return
} }
@ -63,7 +57,7 @@ func evalAssignCoalesce(ctx ExprContext, self *term) (v any, err error) {
} }
leftTerm := self.children[0] leftTerm := self.children[0]
if leftTerm.tk.Sym != SymIdentifier { if leftTerm.tk.Sym != SymVariable {
err = leftTerm.Errorf("left operand of %q must be a variable", self.tk.source) err = leftTerm.Errorf("left operand of %q must be a variable", self.tk.source)
return return
} }
@ -81,11 +75,6 @@ func evalAssignCoalesce(ctx ExprContext, self *term) (v any, err error) {
return return
} }
// utils
// func errCoalesceNoFunc(t *term) error {
// return t.Errorf("the right operand of a coalescing operation cannot be a function definition")
// }
// init // init
func init() { func init() {
registerTermConstructor(SymDoubleQuestion, newNullCoalesceTerm) registerTermConstructor(SymDoubleQuestion, newNullCoalesceTerm)

View File

@ -67,20 +67,8 @@ func evalDot(ctx ExprContext, self *term) (v any, err error) {
err = fmt.Errorf("key %v does not belong to the dictionary", rightValue) err = fmt.Errorf("key %v does not belong to the dictionary", rightValue)
} }
} }
// case *dataCursor:
// if indexTerm.symbol() == SymIdentifier {
// opName := indexTerm.source()
// if opName == resetName {
// _, err = unboxedValue.Reset()
// } else if opName == cleanName {
// _, err = unboxedValue.Clean()
// } else {
// err = indexTerm.Errorf("iterators do not support command %q", opName)
// }
// v = err == nil
// }
case ExtIterator: case ExtIterator:
if indexTerm.symbol() == SymIdentifier { if indexTerm.symbol() == SymVariable {
opName := indexTerm.source() opName := indexTerm.source()
if unboxedValue.HasOperation(opName) { if unboxedValue.HasOperation(opName) {
v, err = unboxedValue.CallOperation(opName, []any{}) v, err = unboxedValue.CallOperation(opName, []any{})

View File

@ -37,7 +37,7 @@ func evalInsert(ctx ExprContext, self *term) (v any, err error) {
list, _ := rightValue.(*ListType) list, _ := rightValue.(*ListType)
newList := append(ListType{leftValue}, *list...) newList := append(ListType{leftValue}, *list...)
v = &newList v = &newList
if self.children[1].symbol() == SymIdentifier { if self.children[1].symbol() == SymVariable {
ctx.UnsafeSetVar(self.children[1].source(), v) ctx.UnsafeSetVar(self.children[1].source(), v)
} }
} else { } else {
@ -57,7 +57,7 @@ func evalAppend(ctx ExprContext, self *term) (v any, err error) {
list, _ := leftValue.(*ListType) list, _ := leftValue.(*ListType)
newList := append(*list, rightValue) newList := append(*list, rightValue)
v = &newList v = &newList
if self.children[0].symbol() == SymIdentifier { if self.children[0].symbol() == SymVariable {
ctx.UnsafeSetVar(self.children[0].source(), v) ctx.UnsafeSetVar(self.children[0].source(), v)
} }
} else { } else {

View File

@ -25,7 +25,7 @@ func evalPostInc(ctx ExprContext, self *term) (v any, err error) {
if it, ok := childValue.(Iterator); ok { if it, ok := childValue.(Iterator); ok {
v, err = it.Next() v, err = it.Next()
} else if IsInteger(childValue) && self.children[0].symbol() == SymIdentifier { } else if IsInteger(childValue) && self.children[0].symbol() == SymVariable {
v = childValue v = childValue
i, _ := childValue.(int64) i, _ := childValue.(int64)
ctx.SetVar(self.children[0].source(), i+1) ctx.SetVar(self.children[0].source(), i+1)

View File

@ -72,6 +72,7 @@ const (
SymIdentifier SymIdentifier
SymBool SymBool
SymInteger SymInteger
SymVariable
SymFloat SymFloat
SymFraction SymFraction
SymString SymString