Browse Source

демо на указатели, методы и NEW

kpmy 10 years ago
parent
commit
72bb7dec86

BIN
code/XevDemo0.oz


BIN
code/XevDemo1.oz


BIN
code/XevDemo10.oz


BIN
code/XevDemo11.oz


BIN
code/XevDemo12.oz


BIN
code/XevDemo13.oz


BIN
code/XevDemo14.oz


BIN
code/XevDemo15.oz


BIN
code/XevDemo16.oz


BIN
code/XevDemo17.oz


BIN
code/XevDemo18.oz


BIN
code/XevDemo19.oz


BIN
code/XevDemo2.oz


BIN
code/XevDemo20.oz


BIN
code/XevDemo3.oz


BIN
code/XevDemo4.oz


BIN
code/XevDemo5.oz


BIN
code/XevDemo6.oz


BIN
code/XevDemo7.oz


BIN
code/XevDemo8.oz


BIN
code/XevDemo9.oz


+ 7 - 0
cp/node/class.go

@@ -169,9 +169,16 @@ func (v *callNode) self() CallNode { return v }
 
 type procedureNode struct {
 	nodeFields
+	super bool
 }
 
 func (v *procedureNode) self() ProcedureNode { return v }
+func (v *procedureNode) Super(x ...string) bool {
+	if len(x) > 0 {
+		v.super = x[0] == "super"
+	}
+	return v.super
+}
 
 type parameterNode struct {
 	nodeFields

+ 1 - 0
cp/node/node.go

@@ -63,6 +63,7 @@ type CallNode interface {
 
 type ProcedureNode interface {
 	self() ProcedureNode
+	Super(...string) bool
 	Node
 }
 

+ 11 - 1
cp/object/object.go

@@ -11,6 +11,7 @@ const (
 	VARIABLE
 	LOCAL_PROC
 	EXTERNAL_PROC
+	TYPE_PROC
 	CONSTANT
 	PARAMETER
 	FIELD
@@ -79,6 +80,8 @@ func New(mode Mode) Object {
 		return new(parameterObject)
 	case EXTERNAL_PROC:
 		return new(externalProcedureObject)
+	case TYPE_PROC:
+		return new(typeProcedureObject)
 	case FIELD:
 		return new(fieldObject)
 	case TYPE:
@@ -141,7 +144,14 @@ type externalProcedureObject struct {
 }
 
 func (p *externalProcedureObject) self() ProcedureObject { return p }
-func (v *variableObject) self() VariableObject           { return v }
+
+type typeProcedureObject struct {
+	objectFields
+}
+
+func (p *typeProcedureObject) self() ProcedureObject { return p }
+
+func (v *variableObject) self() VariableObject { return v }
 
 type constantObject struct {
 	objectFields

+ 1 - 1
fw.go

@@ -26,7 +26,7 @@ func close() {
 func main() {
 	flag.Parse()
 	if name == "" {
-		name = "XevDemo18"
+		name = "XevDemo19"
 	}
 	global := new(stdDomain)
 	modList := module.New()

+ 4 - 1
fw_test.bat

@@ -37,7 +37,10 @@ fw -i=XevDemo17
 IF ERRORLEVEL 1 GOTO err
 fw -i=XevDemo18
 IF ERRORLEVEL 1 GOTO err
-
+fw -i=XevDemo19
+IF ERRORLEVEL 1 GOTO err
+fw -i=XevDemo20
+IF ERRORLEVEL 1 GOTO err
 GOTO ok
 :err
 echo FAILED

+ 10 - 6
xev/converter.go

@@ -79,7 +79,7 @@ func initType(typ string, conv typed) {
 	case "":
 		conv.SetType(object.NOTYPE)
 	default:
-		panic("no such constant type")
+		panic(fmt.Sprintln("no such constant type", typ))
 	}
 }
 
@@ -234,6 +234,9 @@ func (r *Result) doObject(n *Node) object.Object {
 		case "external procedure":
 			ret = object.New(object.EXTERNAL_PROC)
 			ret.SetType(object.PROCEDURE)
+		case "type procedure":
+			ret = object.New(object.TYPE_PROC)
+			ret.SetType(object.PROCEDURE)
 		case "constant":
 			ret = object.New(object.CONSTANT)
 			convertData(n.Data.Obj.Typ, n.Data.Obj.Value, ret.(object.ConstantObject))
@@ -340,15 +343,15 @@ func (r *Result) buildNode(n *Node) (ret node.Node) {
 		case "assign":
 			ret = node.New(constant.ASSIGN)
 			switch n.Data.Nod.Statement {
-			case "assign":
+			case ":=":
 				ret.(node.AssignNode).SetStatement(statement.ASSIGN)
-			case "inc":
+			case "INC":
 				ret.(node.AssignNode).SetStatement(statement.INC)
-			case "dec":
+			case "DEC":
 				ret.(node.AssignNode).SetStatement(statement.DEC)
-			case "incl":
+			case "INCL":
 				ret.(node.AssignNode).SetStatement(statement.INCL)
-			case "excl":
+			case "EXCL":
 				ret.(node.AssignNode).SetStatement(statement.EXCL)
 			default:
 				panic(fmt.Sprintln("unknown assign statement", n.Data.Nod.Statement))
@@ -358,6 +361,7 @@ func (r *Result) buildNode(n *Node) (ret node.Node) {
 		case "procedure":
 			ret = node.New(constant.PROCEDURE)
 			proc = ret.(node.ProcedureNode)
+			proc.Super(n.Data.Nod.Proc)
 		case "parameter":
 			ret = node.New(constant.PARAMETER)
 		case "return":

+ 1 - 0
xev/loader.go

@@ -37,6 +37,7 @@ type CptNode struct {
 	Statement string `xml:"urn:bbcb:component:dev:cpt statement,attr"`
 	Proto     string `xml:"urn:bbcb:component:dev:cpt proto,attr"`
 	From      string `xml:"urn:bbcb:component:dev:cpt from,attr"`
+	Proc      string `xml:"urn:bbcb:component:dev:cpt proc,attr"`
 }
 
 type NodeData struct {