1
0
Эх сурвалжийг харах

обработка типа RECORD, demo7

kpmy 10 жил өмнө
parent
commit
64e5dda2b8

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 1 - 0
XevDemo7.oxf


+ 1 - 0
cp/constant/nodeclass.go

@@ -20,4 +20,5 @@ const (
 	EXIT
 	EXIT
 	LOOP
 	LOOP
 	DEREF
 	DEREF
+	FIELD
 )
 )

+ 22 - 0
cp/node/class.go

@@ -8,6 +8,12 @@ import (
 	"fw/cp/statement"
 	"fw/cp/statement"
 )
 )
 
 
+const INIT constant.Class = -1
+
+type InitNode interface {
+	Node
+}
+
 func New(class constant.Class) Node {
 func New(class constant.Class) Node {
 	switch class {
 	switch class {
 	case constant.ENTER:
 	case constant.ENTER:
@@ -44,6 +50,10 @@ func New(class constant.Class) Node {
 		return new(loopNode)
 		return new(loopNode)
 	case constant.DEREF:
 	case constant.DEREF:
 		return new(derefNode)
 		return new(derefNode)
+	case constant.FIELD:
+		return new(fieldNode)
+	case INIT:
+		return new(initNode)
 	default:
 	default:
 		panic("no such class")
 		panic("no such class")
 	}
 	}
@@ -200,3 +210,15 @@ type derefNode struct {
 }
 }
 
 
 func (v *derefNode) self() DerefNode { return v }
 func (v *derefNode) self() DerefNode { return v }
+
+type fieldNode struct {
+	nodeFields
+}
+
+func (v *fieldNode) self() FieldNode { return v }
+
+type initNode struct {
+	nodeFields
+}
+
+func (v *initNode) self() InitNode { return v }

+ 5 - 0
cp/node/node.go

@@ -118,3 +118,8 @@ type DerefNode interface {
 	self() DerefNode
 	self() DerefNode
 	Node
 	Node
 }
 }
+
+type FieldNode interface {
+	self() FieldNode
+	Node
+}

+ 14 - 0
cp/object/object.go

@@ -9,6 +9,7 @@ const (
 	EXTERNAL_PROC
 	EXTERNAL_PROC
 	CONSTANT
 	CONSTANT
 	PARAMETER
 	PARAMETER
+	FIELD
 )
 )
 
 
 type Object interface {
 type Object interface {
@@ -38,6 +39,11 @@ type ParameterObject interface {
 	self() ParameterObject
 	self() ParameterObject
 }
 }
 
 
+type FieldObject interface {
+	Object
+	self() FieldObject
+}
+
 func New(mode Mode) Object {
 func New(mode Mode) Object {
 	switch mode {
 	switch mode {
 	case HEAD:
 	case HEAD:
@@ -52,6 +58,8 @@ func New(mode Mode) Object {
 		return new(parameterObject)
 		return new(parameterObject)
 	case EXTERNAL_PROC:
 	case EXTERNAL_PROC:
 		return new(externalProcedureObject)
 		return new(externalProcedureObject)
+	case FIELD:
+		return new(fieldObject)
 	default:
 	default:
 		panic("no such object mode")
 		panic("no such object mode")
 	}
 	}
@@ -107,3 +115,9 @@ type parameterObject struct {
 }
 }
 
 
 func (v *parameterObject) self() ParameterObject { return v }
 func (v *parameterObject) self() ParameterObject { return v }
+
+type fieldObject struct {
+	objectFields
+}
+
+func (v *fieldObject) self() FieldObject { return v }

+ 8 - 0
cp/object/type.go

@@ -123,3 +123,11 @@ type arr struct {
 
 
 func (a *arr) Base() Type { return a.base }
 func (a *arr) Base() Type { return a.base }
 func (a *arr) Len() int64 { return a.length }
 func (a *arr) Len() int64 { return a.length }
+
+type rec struct {
+	comp
+}
+
+func NewRecordType() RecordType {
+	return &rec{}
+}

+ 1 - 1
fw.go

@@ -22,7 +22,7 @@ func init() {
 func main() {
 func main() {
 	flag.Parse()
 	flag.Parse()
 	if name == "" {
 	if name == "" {
-		name = "XevDemo6"
+		name = "XevDemo7"
 	}
 	}
 	global := new(stdDomain)
 	global := new(stdDomain)
 	modList := module.New()
 	modList := module.New()

+ 1 - 1
rt2/rules/assign.go

@@ -81,7 +81,7 @@ func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 	switch a.(node.AssignNode).Statement() {
 	switch a.(node.AssignNode).Statement() {
 	case statement.ASSIGN:
 	case statement.ASSIGN:
 		switch a.Left().(type) {
 		switch a.Left().(type) {
-		case node.VariableNode, node.ParameterNode:
+		case node.VariableNode, node.ParameterNode, node.FieldNode:
 			seq, ret = right(f)
 			seq, ret = right(f)
 		default:
 		default:
 			fmt.Println(reflect.TypeOf(a.Left()))
 			fmt.Println(reflect.TypeOf(a.Left()))

+ 1 - 1
rt2/rules/op.go

@@ -196,7 +196,7 @@ func dopSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 		case node.ConstantNode:
 		case node.ConstantNode:
 			fu.DataOf(f)[n.Left()] = n.Left().(node.ConstantNode).Data()
 			fu.DataOf(f)[n.Left()] = n.Left().(node.ConstantNode).Data()
 			return right, frame.NOW
 			return right, frame.NOW
-		case node.VariableNode, node.ParameterNode:
+		case node.VariableNode, node.ParameterNode, 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)
 				sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
 				fu.DataOf(f)[n.Left()] = sc.Select(n.Left().Object())
 				fu.DataOf(f)[n.Left()] = sc.Select(n.Left().Object())

+ 3 - 1
rt2/rules/table.go

@@ -46,6 +46,8 @@ func prologue(n node.Node) frame.Sequence {
 		return exitSeq
 		return exitSeq
 	case node.DerefNode:
 	case node.DerefNode:
 		return derefSeq
 		return derefSeq
+	case node.InitNode:
+		return frame.Tail(frame.STOP)
 	default:
 	default:
 		panic(fmt.Sprintln("unknown node", reflect.TypeOf(n)))
 		panic(fmt.Sprintln("unknown node", reflect.TypeOf(n)))
 	}
 	}
@@ -54,7 +56,7 @@ func prologue(n node.Node) frame.Sequence {
 func epilogue(n node.Node) frame.Sequence {
 func epilogue(n node.Node) frame.Sequence {
 	var fu nodeframe.FrameUtils
 	var fu nodeframe.FrameUtils
 	switch n.(type) {
 	switch n.(type) {
-	case node.AssignNode, node.CallNode, node.ConditionalNode, node.WhileNode, node.RepeatNode, node.ExitNode:
+	case node.AssignNode, node.InitNode, node.CallNode, node.ConditionalNode, node.WhileNode, node.RepeatNode, node.ExitNode:
 		return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
 		return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
 			next := n.Link()
 			next := n.Link()
 			if next != nil {
 			if next != nil {

+ 6 - 4
rt2/scope/stdScope.go

@@ -89,10 +89,12 @@ func (m *manager) Allocate(n node.Node) {
 	for _, o := range mod.Objects[n] {
 	for _, o := range mod.Objects[n] {
 		//fmt.Println(reflect.TypeOf(o))
 		//fmt.Println(reflect.TypeOf(o))
 		switch o.(type) {
 		switch o.(type) {
-		case object.VariableObject:
+		case object.VariableObject, object.FieldObject:
 			h.heap[o] = &direct{data: def}
 			h.heap[o] = &direct{data: def}
 		case object.ParameterObject:
 		case object.ParameterObject:
 			h.heap[o] = &indirect{mgr: m}
 			h.heap[o] = &indirect{mgr: m}
+		default:
+			panic(fmt.Sprintln("wrong object type", reflect.TypeOf(o)))
 		}
 		}
 	}
 	}
 	m.areas.PushFront(h)
 	m.areas.PushFront(h)
@@ -103,7 +105,7 @@ func (m *manager) set(a *area, o object.Object, val node.Node) {
 	switch val.(type) {
 	switch val.(type) {
 	case node.ConstantNode:
 	case node.ConstantNode:
 		switch o.(type) {
 		switch o.(type) {
-		case object.VariableObject:
+		case object.VariableObject, object.FieldObject:
 			m.Update(o, func(old interface{}) interface{} {
 			m.Update(o, func(old interface{}) interface{} {
 				return val.(node.ConstantNode).Data()
 				return val.(node.ConstantNode).Data()
 			})
 			})
@@ -115,9 +117,9 @@ func (m *manager) set(a *area, o object.Object, val node.Node) {
 		default:
 		default:
 			panic("unknown value")
 			panic("unknown value")
 		}
 		}
-	case node.VariableNode, node.ParameterNode:
+	case node.VariableNode, node.ParameterNode, node.FieldNode:
 		switch o.(type) {
 		switch o.(type) {
-		case object.VariableObject:
+		case object.VariableObject, object.FieldObject:
 			m.Update(o, func(old interface{}) interface{} {
 			m.Update(o, func(old interface{}) interface{} {
 				return m.Select(val.Object())
 				return m.Select(val.Object())
 			})
 			})

+ 15 - 0
xev/converter.go

@@ -190,6 +190,14 @@ func (r *Result) doType(n *Node) (ret object.ComplexType) {
 		default:
 		default:
 			panic(fmt.Sprintln("unknown type", n.Data.Typ.Typ))
 			panic(fmt.Sprintln("unknown type", n.Data.Typ.Typ))
 		}
 		}
+	case "RECORD":
+		switch n.Data.Typ.Base {
+		case "NOTYP":
+			n := object.NewRecordType()
+			ret = n
+		default:
+			panic("unknown record base")
+		}
 	default:
 	default:
 		panic(fmt.Sprintln("unknown form", n.Data.Typ.Form))
 		panic(fmt.Sprintln("unknown form", n.Data.Typ.Form))
 	}
 	}
@@ -218,6 +226,9 @@ func (r *Result) doObject(n *Node) object.Object {
 		case "parameter":
 		case "parameter":
 			ret = object.New(object.PARAMETER)
 			ret = object.New(object.PARAMETER)
 			initType(n.Data.Obj.Typ, ret.(object.ParameterObject))
 			initType(n.Data.Obj.Typ, ret.(object.ParameterObject))
+		case "field":
+			ret = object.New(object.FIELD)
+			initType(n.Data.Obj.Typ, ret.(object.FieldObject))
 		default:
 		default:
 			fmt.Println(n.Data.Obj.Mode)
 			fmt.Println(n.Data.Obj.Mode)
 			panic("no such object mode")
 			panic("no such object mode")
@@ -349,6 +360,10 @@ func (r *Result) buildNode(n *Node) (ret node.Node) {
 			ret = node.New(constant.EXIT)
 			ret = node.New(constant.EXIT)
 		case "dereferencing":
 		case "dereferencing":
 			ret = node.New(constant.DEREF)
 			ret = node.New(constant.DEREF)
+		case "field":
+			ret = node.New(constant.FIELD)
+		case "init":
+			ret = node.New(node.INIT)
 		default:
 		default:
 			fmt.Println(n.Data.Nod.Class)
 			fmt.Println(n.Data.Nod.Class)
 			panic("no such node type")
 			panic("no such node type")

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно