Expressions now support function definition

This commit is contained in:
2024-04-02 04:36:03 +02:00
parent f58ec3ac32
commit 072dab4144
20 changed files with 376 additions and 143 deletions
+16 -10
View File
@@ -10,11 +10,15 @@ import (
"strings"
)
type Expr interface {
Eval(ctx exprContext, preset bool) (result any, err error)
}
//-------- ast
type ast struct {
forest []*term
root *term
root *term
}
func NewAst() *ast {
@@ -54,7 +58,7 @@ func (self *ast) addToken(tk *Token) (err error) {
if t := newTerm(tk, nil); t != nil {
err = self.addTerm(t)
} else {
err = fmt.Errorf("No term constructor for token %q", tk.String())
err = tk.Errorf("No term constructor for token %q", tk.String())
}
return
}
@@ -83,23 +87,25 @@ func (self *ast) insert(tree, node *term) (root *term, err error) {
root = node
tree.setParent(node)
} else {
err = fmt.Errorf("two adjacent operators: %q and %q", tree, node)
err = node.Errorf("two adjacent operators: %q and %q", tree, node)
}
return
}
func (self *ast) Finish() {
if self.root == nil && self.forest != nil && len(self.forest) >= 1 {
self.root = self.forest[len(self.forest)-1]
self.forest = self.forest[0:len(self.forest) - 1]
}
if self.root == nil && self.forest != nil && len(self.forest) >= 1 {
self.root = self.forest[len(self.forest)-1]
self.forest = self.forest[0 : len(self.forest)-1]
}
}
func (self *ast) Eval(ctx exprContext) (result any, err error) {
func (self *ast) Eval(ctx exprContext, preset bool) (result any, err error) {
self.Finish()
if self.root != nil {
initDefaultVars(ctx)
if preset {
initDefaultVars(ctx)
}
if self.forest != nil {
for i, root := range self.forest {
if result, err = root.compute(ctx); err == nil {
@@ -121,7 +127,7 @@ func (self *ast) Eval(ctx exprContext) (result any, err error) {
// Preset variables
const (
preset_last_result = "_last"
preset_last_result = "_last"
preset_bool_shortcut = "_bool_shortcut"
)