浏览代码

добавил новый алгоритм адресации полей, заработала демо7

kpmy 10 年之前
父节点
当前提交
f853e2ace9
共有 8 个文件被更改,包括 84 次插入37 次删除
  1. 17 30
      rt2/rules/assign.go
  2. 42 0
      rt2/rules/field.go
  3. 5 3
      rt2/rules/op.go
  4. 3 1
      rt2/rules/table.go
  5. 1 1
      rt2/scope/area.go
  6. 1 1
      rt2/scope/data.go
  7. 6 1
      rt2/scope/modern/ms.go
  8. 9 0
      rt2/scope/modern/val.go

+ 17 - 30
rt2/rules/assign.go

@@ -12,7 +12,6 @@ import (
 	"fw/rt2/frame"
 	"fw/rt2/frame"
 	"fw/rt2/scope"
 	"fw/rt2/scope"
 	"reflect"
 	"reflect"
-	"ypk/halt"
 )
 )
 
 
 func incSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 func incSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
@@ -50,22 +49,23 @@ func decSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 	a := rt2.NodeOf(f)
 	a := rt2.NodeOf(f)
 
 
-	var leftId cp.ID
+	var left scope.Value
 	var rightId cp.ID
 	var rightId cp.ID
 
 
 	right := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 	right := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
+		vleft := left.(scope.Variable)
 		switch a.Right().(type) {
 		switch a.Right().(type) {
 		case node.ConstantNode:
 		case node.ConstantNode:
 			seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 			seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 				sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
 				sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
-				sc.Update(leftId, sc.Provide(a.Right())) //scope.Simple(a.Right().(node.ConstantNode).Data()))
+				vleft.Set(sc.Provide(a.Right())(nil)) //scope.Simple(a.Right().(node.ConstantNode).Data()))
 				return frame.End()
 				return frame.End()
 			}
 			}
 			ret = frame.NOW
 			ret = frame.NOW
 		case node.VariableNode, node.ParameterNode:
 		case node.VariableNode, node.ParameterNode:
 			seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 			seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 				sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
 				sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
-				sc.Update(leftId, scope.Simple(sc.Select(a.Right().Object().Adr())))
+				vleft.Set(sc.Select(a.Right().Object().Adr()))
 				return frame.End()
 				return frame.End()
 			}
 			}
 			ret = frame.NOW
 			ret = frame.NOW
@@ -75,8 +75,8 @@ func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 				return rt2.ValueOf(f)[a.Right().Adr()] != nil, 61
 				return rt2.ValueOf(f)[a.Right().Adr()] != nil, 61
 			})
 			})
 			seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 			seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
-				sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
-				sc.Update(leftId, scope.Simple(rt2.ValueOf(f)[a.Right().Adr()]))
+				//sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
+				vleft.Set(rt2.ValueOf(f)[a.Right().Adr()])
 				return frame.End()
 				return frame.End()
 			}
 			}
 			ret = frame.LATER
 			ret = frame.LATER
@@ -95,7 +95,7 @@ func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 			ret = frame.LATER
 			ret = frame.LATER
 		case node.ProcedureNode:
 		case node.ProcedureNode:
 			sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
 			sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
-			sc.Update(leftId, sc.Provide(a.Right().Object()))
+			vleft.Set(sc.Provide(a.Right().Object())(nil))
 			return frame.End()
 			return frame.End()
 		default:
 		default:
 			fmt.Println(reflect.TypeOf(a.Right()))
 			fmt.Println(reflect.TypeOf(a.Right()))
@@ -108,32 +108,19 @@ func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 	case statement.ASSIGN:
 	case statement.ASSIGN:
 		switch l := a.Left().(type) {
 		switch l := a.Left().(type) {
 		case node.VariableNode, node.ParameterNode:
 		case node.VariableNode, node.ParameterNode:
-			leftId = a.Left().Object().Adr()
+			sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
+			left = sc.Select(a.Left().Object().Adr())
 			seq, ret = right(f)
 			seq, ret = right(f)
 		case node.FieldNode:
 		case node.FieldNode:
-			switch l.Left().(type) {
-			case node.GuardNode:
-				rt2.Push(rt2.New(l.Left()), f)
-				seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
-					//					x := rt2.DataOf(f)[l.Left()].(node.Node)
-					//					leftId = scope.Designator(a.Left(), x)
-					return right(f)
-				}
-				ret = frame.LATER
-			case node.DerefNode:
-				//				rt2.DataOf(f)[l.Left()] = scope.ID{}
-				rt2.Push(rt2.New(l.Left()), f)
-				seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
-					//					leftId = rt2.DataOf(f)[l.Left()].(scope.ID)
-					//					leftId.Path = a.Left().Object().Name()
-					return right(f)
-				}
-				ret = frame.LATER
-			default:
-				halt.As(100, l.Object().Adr(), l.Left().Object().Adr())
-				//				leftId = scope.Designator(a.Left())
-				seq, ret = right(f)
+			rt2.Push(rt2.New(l), f)
+			rt2.Assert(f, func(f frame.Frame) (bool, int) {
+				return rt2.ValueOf(f)[l.Adr()] != nil, 62
+			})
+			seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
+				left = rt2.ValueOf(f)[l.Adr()]
+				return right(f)
 			}
 			}
+			ret = frame.LATER
 		case node.IndexNode:
 		case node.IndexNode:
 			//			leftId = scope.Designator(a.Left())
 			//			leftId = scope.Designator(a.Left())
 			rt2.Push(rt2.New(a.Left()), f)
 			rt2.Push(rt2.New(a.Left()), f)

+ 42 - 0
rt2/rules/field.go

@@ -0,0 +1,42 @@
+package rules
+
+import (
+	"reflect"
+)
+
+import (
+	"fw/cp/node"
+	"fw/rt2"
+	"fw/rt2/context"
+	"fw/rt2/frame"
+	"fw/rt2/scope"
+	"ypk/halt"
+)
+
+func fieldSeq(in ...IN) (out OUT) {
+	f := in[0].frame
+	n := rt2.NodeOf(f)
+	sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
+	switch l := n.Left().(type) {
+	case node.VariableNode:
+		sc.Select(l.Object().Adr(), func(v scope.Value) {
+			rt2.ValueOf(f.Parent())[n.Adr()] = v.(scope.Record).Get(n.Object().Adr())
+		})
+		out = End()
+	case node.FieldNode:
+		rt2.Push(rt2.New(l), f)
+		rt2.Assert(f, func(f frame.Frame) (bool, int) {
+			_, ok := rt2.ValueOf(f)[l.Adr()].(scope.Record)
+			return ok, 60
+		})
+		out.do = func(in ...IN) OUT {
+			v := rt2.ValueOf(in[0].frame)[l.Adr()].(scope.Record)
+			rt2.ValueOf(f.Parent())[n.Adr()] = v.Get(n.Object().Adr())
+			return End()
+		}
+		out.next = LATER
+	default:
+		halt.As(100, reflect.TypeOf(l))
+	}
+	return out
+}

+ 5 - 3
rt2/rules/op.go

@@ -476,7 +476,7 @@ func dopSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 
 
 	left := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 	left := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 		n := rt2.NodeOf(f)
 		n := rt2.NodeOf(f)
-		switch n.Left().(type) {
+		switch l := n.Left().(type) {
 		case node.ConstantNode:
 		case node.ConstantNode:
 			rt2.ValueOf(f)[n.Left().Adr()] = sc.Provide(n.Left())(nil)
 			rt2.ValueOf(f)[n.Left().Adr()] = sc.Provide(n.Left())(nil)
 			return right, frame.NOW
 			return right, frame.NOW
@@ -496,8 +496,10 @@ func dopSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 			return seq, ret
 			return seq, ret
 		case node.FieldNode:
 		case node.FieldNode:
 			seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 			seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
-				//				sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
-				//				rt2.DataOf(f)[n.Left()] = sc.Select(scope.Designator(n.Left()))
+				sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
+				sc.Select(l.Left().Object().Adr(), func(v scope.Value) {
+					rt2.ValueOf(f)[n.Left().Adr()] = v.(scope.Record).Get(l.Object().Adr())
+				})
 				return right, frame.NOW
 				return right, frame.NOW
 			}
 			}
 			ret = frame.NOW
 			ret = frame.NOW

+ 3 - 1
rt2/rules/table.go

@@ -56,6 +56,8 @@ func prologue(n node.Node) frame.Sequence {
 		return frame.Tail(frame.STOP)
 		return frame.Tail(frame.STOP)
 	case node.IndexNode:
 	case node.IndexNode:
 		return indexSeq
 		return indexSeq
+	case node.FieldNode:
+		return Propose(fieldSeq)
 	case node.TrapNode:
 	case node.TrapNode:
 		return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
 		return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
 			switch code := next.Left().(type) {
 			switch code := next.Left().(type) {
@@ -129,7 +131,7 @@ func epilogue(n node.Node) frame.Sequence {
 			return frame.End()
 			return frame.End()
 		}
 		}
 	case node.OperationNode, node.ReturnNode, node.IfNode, node.LoopNode,
 	case node.OperationNode, node.ReturnNode, node.IfNode, node.LoopNode,
-		node.DerefNode, node.IndexNode, node.TrapNode, node.GuardNode, node.RangeNode:
+		node.DerefNode, node.IndexNode, node.TrapNode, node.GuardNode, node.RangeNode, node.FieldNode:
 		return nil
 		return nil
 	default:
 	default:
 		fmt.Println(reflect.TypeOf(n))
 		fmt.Println(reflect.TypeOf(n))

+ 1 - 1
rt2/scope/area.go

@@ -20,7 +20,7 @@ type PARAM struct {
 type Manager interface {
 type Manager interface {
 	context.ContextAware
 	context.ContextAware
 	Update(id cp.ID, val ValueFor)
 	Update(id cp.ID, val ValueFor)
-	Select(id cp.ID) Value
+	Select(cp.ID, ...ValueOf) Value
 	Target(...Allocator) Allocator
 	Target(...Allocator) Allocator
 	Provide(interface{}) ValueFor
 	Provide(interface{}) ValueFor
 	String() string
 	String() string

+ 1 - 1
rt2/scope/data.go

@@ -42,6 +42,7 @@ type Record interface {
 
 
 //средство обновления значенияx
 //средство обновления значенияx
 type ValueFor func(in Value) (out Value)
 type ValueFor func(in Value) (out Value)
+type ValueOf func(in Value)
 
 
 func Simple(v Value) ValueFor {
 func Simple(v Value) ValueFor {
 	return func(Value) Value {
 	return func(Value) Value {
@@ -50,7 +51,6 @@ func Simple(v Value) ValueFor {
 }
 }
 
 
 var ValueFrom func(v Value) Value
 var ValueFrom func(v Value) Value
-var ValueOf func(v Value)
 var GoTypeFrom func(v Value) interface{}
 var GoTypeFrom func(v Value) interface{}
 var TypeFromGo func(v interface{}) Value
 var TypeFromGo func(v interface{}) Value
 var Ops Operations
 var Ops Operations

+ 6 - 1
rt2/scope/modern/ms.go

@@ -253,6 +253,7 @@ func (a *area) Update(id cp.ID, fval scope.ValueFor) {
 	upd(len(a.data), id)
 	upd(len(a.data), id)
 	assert.For(k != 0, 60)
 	assert.For(k != 0, 60)
 }
 }
+
 func (a *area) Select(id cp.ID, val ...scope.ValueOf) (ret scope.Value) {
 func (a *area) Select(id cp.ID, val ...scope.ValueOf) (ret scope.Value) {
 	fmt.Println("SELECT", id)
 	fmt.Println("SELECT", id)
 	var sel func(x int, id cp.ID)
 	var sel func(x int, id cp.ID)
@@ -267,7 +268,11 @@ func (a *area) Select(id cp.ID, val ...scope.ValueOf) (ret scope.Value) {
 					if ret == nil { //ref?
 					if ret == nil { //ref?
 						r := l.r[k]
 						r := l.r[k]
 						if r != nil {
 						if r != nil {
-							sel(i, r.(*ref).id)
+							if l.l[k] != nil { //rec
+								panic(0)
+							} else {
+								sel(i, r.(*ref).id)
+							}
 							break
 							break
 						}
 						}
 					} else if len(val) > 0 {
 					} else if len(val) > 0 {

+ 9 - 0
rt2/scope/modern/val.go

@@ -50,6 +50,15 @@ func (r *rec) Set(v scope.Value) {
 
 
 }
 }
 
 
+func (r *rec) Get(id cp.ID) scope.Value {
+	k := r.l.k[id]
+	if r.l.v[k] == nil { //ref
+		return r.l.r[k]
+	} else {
+		return r.l.v[k]
+	}
+}
+
 func newRec(o object.Object) *rec {
 func newRec(o object.Object) *rec {
 	_, ok := o.Complex().(object.RecordType)
 	_, ok := o.Complex().(object.RecordType)
 	assert.For(ok, 20)
 	assert.For(ok, 20)