12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- package rules
- import (
- "fmt"
- "fw/cp/node"
- "fw/rt2"
- "fw/rt2/frame"
- "fw/rt2/scope"
- "reflect"
- "ypk/assert"
- )
- //функция вернет в данные родительского фрейма вычисленное значение expr
- func expectExpr(parent frame.Frame, expr node.Node, next Do) OUT {
- assert.For(expr != nil, 20)
- sm := rt2.ScopeOf(parent)
- switch e := expr.(type) {
- case node.ConstantNode:
- rt2.ValueOf(parent)[expr.Adr()] = sm.Provide(e)(nil)
- return OUT{do: next, next: NOW}
- case node.VariableNode, node.ParameterNode:
- rt2.ValueOf(parent)[expr.Adr()] = sm.Select(expr.Object().Adr())
- return OUT{do: next, next: NOW}
- case node.OperationNode, node.CallNode, node.DerefNode:
- rt2.Push(rt2.New(expr), parent)
- wait := func(...IN) OUT {
- if rt2.RegOf(parent)[expr] == nil && rt2.ValueOf(parent)[expr.Adr()] == nil {
- panic("no result")
- }
- return OUT{do: next, next: NOW}
- }
- return OUT{do: wait, next: LATER}
- case node.IndexNode:
- rt2.Push(rt2.New(e), parent)
- rt2.Assert(parent, func(f frame.Frame) (bool, int) {
- return rt2.ValueOf(f)[e.Adr()] != nil, 64
- })
- wait := func(...IN) OUT {
- idx := rt2.ValueOf(parent)[e.Adr()]
- arr := sm.Select(e.Left().Object().Adr()).(scope.Array)
- idx = arr.Get(idx)
- rt2.ValueOf(parent)[e.Adr()] = idx
- return OUT{do: next, next: NOW}
- }
- return OUT{do: wait, next: LATER}
- case node.ProcedureNode:
- rt2.RegOf(parent)[expr] = e.Object()
- return OUT{do: next, next: NOW}
- default:
- panic(fmt.Sprintln("not an expression", reflect.TypeOf(expr)))
- }
- }
|