Bläddra i källkod

добавил операции ">" и DEC

kpmy 10 år sedan
förälder
incheckning
21708c7c5f

BIN
code/XevDemo1.oz


BIN
code/XevDemo11.oz


BIN
code/XevDemo12.oz


BIN
code/XevDemo14.oz


BIN
code/XevDemo15.oz


BIN
code/XevDemo4.oz


BIN
code/XevDemo5.oz


BIN
code/XevDemo6.oz


BIN
code/XevDemo7.oz


BIN
code/XevDemo8.oz


+ 1 - 0
cp/constant/operation/operation.go

@@ -13,4 +13,5 @@ const (
 	NOT
 	NOT_EQUAL
 	IS
+	GREATER
 )

+ 1 - 0
cp/statement/statement.go → cp/constant/statement/statement.go

@@ -5,4 +5,5 @@ type Statement int
 const (
 	ASSIGN Statement = iota
 	INC
+	DEC
 )

+ 1 - 1
cp/node/class.go

@@ -4,8 +4,8 @@ import (
 	"fw/cp/constant"
 	"fw/cp/constant/enter"
 	"fw/cp/constant/operation"
+	"fw/cp/constant/statement"
 	"fw/cp/object"
-	"fw/cp/statement"
 )
 
 const INIT constant.Class = -1

+ 1 - 1
cp/node/node.go

@@ -3,8 +3,8 @@ package node
 import (
 	"fw/cp/constant/enter"
 	"fw/cp/constant/operation"
+	"fw/cp/constant/statement"
 	"fw/cp/object"
-	"fw/cp/statement"
 )
 
 type Node interface {

BIN
doc/ast-rules.pdf


BIN
doc/ast.odt


+ 1 - 1
fw.go

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

+ 26 - 1
rt2/rules/assign.go

@@ -4,8 +4,8 @@ import (
 	"fmt"
 	"fw/cp/constant"
 	"fw/cp/constant/operation"
+	"fw/cp/constant/statement"
 	"fw/cp/node"
-	"fw/cp/statement"
 	"fw/rt2"
 	"fw/rt2/context"
 	"fw/rt2/frame"
@@ -32,6 +32,24 @@ func incSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 	return seq, ret
 }
 
+func decSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
+	n := rt2.NodeOf(f)
+	op := node.New(constant.DYADIC).(node.OperationNode)
+	op.SetOperation(operation.MINUS)
+	op.SetLeft(n.Left())
+	op.SetRight(n.Right())
+	rt2.Push(rt2.New(op), f)
+	seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
+		sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
+		sc.Update(scope.Designator(n.Left()), func(interface{}) interface{} {
+			return rt2.DataOf(f)[op]
+		})
+		return frame.End()
+	}
+	ret = frame.LATER
+	return seq, ret
+}
+
 func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 	var fu nodeframe.FrameUtils
 	a := fu.NodeOf(f)
@@ -136,6 +154,13 @@ func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 		default:
 			panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
 		}
+	case statement.DEC:
+		switch a.Left().(type) {
+		case node.VariableNode, node.ParameterNode:
+			seq, ret = decSeq(f)
+		default:
+			panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
+		}
 	default:
 		panic(fmt.Sprintln("wrong statement", a.(node.AssignNode).Statement()))
 	}

+ 10 - 0
rt2/rules/op.go

@@ -73,6 +73,13 @@ func lss(_a interface{}, _b interface{}) bool {
 	return a < b
 }
 
+func gtr(_a interface{}, _b interface{}) bool {
+	assert.For(_a != nil, 20)
+	assert.For(_b != nil, 21)
+	var a int32 = int32Of(_a)
+	var b int32 = int32Of(_b)
+	return a > b
+}
 func leq(_a interface{}, _b interface{}) bool {
 	assert.For(_a != nil, 20)
 	assert.For(_b != nil, 21)
@@ -267,6 +274,9 @@ func dopSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 		case operation.NOT_EQUAL:
 			fu.DataOf(f.Parent())[n] = neq(fu.DataOf(f)[n.Left()], fu.DataOf(f)[n.Right()])
 			return frame.End()
+		case operation.GREATER:
+			fu.DataOf(f.Parent())[n] = gtr(fu.DataOf(f)[n.Left()], fu.DataOf(f)[n.Right()])
+			return frame.End()
 		default:
 			panic("unknown operation")
 		}

+ 5 - 1
xev/converter.go

@@ -5,10 +5,10 @@ import (
 	"fw/cp/constant"
 	"fw/cp/constant/enter"
 	"fw/cp/constant/operation"
+	"fw/cp/constant/statement"
 	"fw/cp/module"
 	"fw/cp/node"
 	"fw/cp/object"
-	"fw/cp/statement"
 	"math/big"
 	"strconv"
 	"unicode/utf16"
@@ -338,6 +338,8 @@ func (r *Result) buildNode(n *Node) (ret node.Node) {
 				ret.(node.OperationNode).SetOperation(operation.LEN)
 			case "#":
 				ret.(node.OperationNode).SetOperation(operation.NOT_EQUAL)
+			case ">":
+				ret.(node.OperationNode).SetOperation(operation.GREATER)
 			default:
 				panic(fmt.Sprintln("no such operation", n.Data.Nod.Operation))
 			}
@@ -361,6 +363,8 @@ func (r *Result) buildNode(n *Node) (ret node.Node) {
 				ret.(node.AssignNode).SetStatement(statement.ASSIGN)
 			case "inc":
 				ret.(node.AssignNode).SetStatement(statement.INC)
+			case "dec":
+				ret.(node.AssignNode).SetStatement(statement.DEC)
 			default:
 				panic("unknown assign statement")
 			}