ast: now supports espression forest (multi expressions)

This commit is contained in:
2024-03-31 05:57:02 +02:00
parent aa705e68bf
commit 4e361f938e
4 changed files with 41 additions and 8 deletions
+35 -2
View File
@@ -13,6 +13,7 @@ import (
//-------- ast
type ast struct {
forest []*term
root *term
}
@@ -20,6 +21,16 @@ func NewAst() *ast {
return &ast{}
}
func (self *ast) ToForest() {
if self.root != nil {
if self.forest == nil {
self.forest = make([]*term, 0)
}
self.forest = append(self.forest, self.root)
self.root = nil
}
}
func (self *ast) String() string {
var sb strings.Builder
if self.root == nil {
@@ -77,10 +88,31 @@ func (self *ast) insert(tree, node *term) (root *term, err error) {
return
}
func (self *ast) eval(ctx exprContext) (result any, err error) {
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]
}
}
func (self *ast) Eval(ctx exprContext) (result any, err error) {
self.Finish()
if self.root != nil {
initDefaultVars(ctx)
result, err = self.root.compute(ctx)
if self.forest != nil {
for i, root := range self.forest {
if result, err = root.compute(ctx); err == nil {
ctx.SetValue(preset_last_result, result)
} else {
err = fmt.Errorf("error in expression nr %d: %v", i+1, err)
break
}
}
}
if err == nil {
result, err = self.root.compute(ctx)
}
} else {
err = errors.New("empty expression")
}
@@ -89,6 +121,7 @@ func (self *ast) eval(ctx exprContext) (result any, err error) {
// Preset variables
const (
preset_last_result = "_last"
preset_bool_shortcut = "_bool_shortcut"
)