Sfoglia il codice sorgente

добавлены операции

kpmy 10 anni fa
parent
commit
193091f4d8

BIN
code/PrivDemo18.oz


BIN
code/XevDemo1.oz


BIN
code/XevDemo11.oz


BIN
code/XevDemo12.oz


BIN
code/XevDemo14.oz


BIN
code/XevDemo15.oz


BIN
code/XevDemo16.oz


BIN
code/XevDemo17.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


+ 71 - 2
cp/constant/operation/operation.go

@@ -1,9 +1,14 @@
 package operation
 
+import (
+	"ypk/assert"
+)
+
 type Operation int
 
 const (
-	PLUS Operation = iota
+	WRONG Operation = iota
+	PLUS
 	MINUS
 	CONVERT
 	EQUAL
@@ -20,8 +25,54 @@ const (
 	BITS
 	MIN
 	MAX
+	DIV
+	MOD
+	TIMES
+	SLASH
+	IN
+	OR
+	AND
+	ASH
+	GREAT_EQUAL
 )
 
+var this map[string]Operation = make(map[string]Operation)
+
+func init() {
+	this[PLUS.String()] = PLUS
+	this[MINUS.String()] = MINUS
+	this[CONVERT.String()] = CONVERT
+	this[EQUAL.String()] = EQUAL
+	this[LESSER.String()] = LESSER
+	this[LESS_EQUAL.String()] = LESS_EQUAL
+	this[LEN.String()] = LEN
+	this[NOT.String()] = NOT
+	this[NOT_EQUAL.String()] = NOT_EQUAL
+	this[IS.String()] = IS
+	this[GREATER.String()] = GREATER
+	this[ABS.String()] = ABS
+	this[ODD.String()] = ODD
+	this[CAP.String()] = CAP
+	this[BITS.String()] = BITS
+	this[MIN.String()] = MIN
+	this[MAX.String()] = MAX
+	this[DIV.String()] = DIV
+	this[MOD.String()] = MOD
+	this[TIMES.String()] = TIMES
+	this[SLASH.String()] = SLASH
+	this[IN.String()] = IN
+	this[OR.String()] = OR
+	this[AND.String()] = AND
+	this[ASH.String()] = ASH
+	this[GREAT_EQUAL.String()] = GREAT_EQUAL
+}
+
+func This(s string) (ret Operation) {
+	ret = this[s]
+	assert.For(ret != WRONG, 40)
+	return ret
+}
+
 func (o Operation) String() string {
 	switch o {
 	case PLUS:
@@ -29,7 +80,7 @@ func (o Operation) String() string {
 	case MINUS:
 		return "-"
 	case CONVERT:
-		return "CONVERT"
+		return "CONV"
 	case EQUAL:
 		return "="
 	case LESSER:
@@ -58,6 +109,24 @@ func (o Operation) String() string {
 		return "MIN"
 	case MAX:
 		return "MAX"
+	case DIV:
+		return "DIV"
+	case MOD:
+		return "MOD"
+	case TIMES:
+		return "*"
+	case SLASH:
+		return "/"
+	case IN:
+		return "IN"
+	case OR:
+		return "OR"
+	case AND:
+		return "&"
+	case ASH:
+		return "ASH"
+	case GREAT_EQUAL:
+		return ">="
 	default:
 		return "?"
 	}

+ 1 - 1
fw.go

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

+ 4 - 0
fw_test.bat

@@ -33,6 +33,10 @@ fw -i=XevDemo15
 IF ERRORLEVEL 1 GOTO err
 fw -i=XevDemo16
 IF ERRORLEVEL 1 GOTO err
+fw -i=XevDemo17
+IF ERRORLEVEL 1 GOTO err
+fw -i=XevDemo18
+IF ERRORLEVEL 1 GOTO err
 
 GOTO ok
 :err

+ 3 - 39
xev/converter.go

@@ -323,30 +323,7 @@ func (r *Result) buildNode(n *Node) (ret node.Node) {
 			ret = node.New(constant.VARIABLE)
 		case "dyadic":
 			ret = node.New(constant.DYADIC)
-			switch n.Data.Nod.Operation {
-			case "+":
-				ret.(node.OperationNode).SetOperation(operation.PLUS)
-			case "-":
-				ret.(node.OperationNode).SetOperation(operation.MINUS)
-			case "=":
-				ret.(node.OperationNode).SetOperation(operation.EQUAL)
-			case "<":
-				ret.(node.OperationNode).SetOperation(operation.LESSER)
-			case "<=":
-				ret.(node.OperationNode).SetOperation(operation.LESS_EQUAL)
-			case "len":
-				ret.(node.OperationNode).SetOperation(operation.LEN)
-			case "#":
-				ret.(node.OperationNode).SetOperation(operation.NOT_EQUAL)
-			case ">":
-				ret.(node.OperationNode).SetOperation(operation.GREATER)
-			case "max":
-				ret.(node.OperationNode).SetOperation(operation.MAX)
-			case "min":
-				ret.(node.OperationNode).SetOperation(operation.MIN)
-			default:
-				panic(fmt.Sprintln("no such operation", n.Data.Nod.Operation))
-			}
+			ret.(node.OperationNode).SetOperation(operation.This(n.Data.Nod.Operation))
 		case "constant":
 			ret = node.New(constant.CONSTANT)
 			convertData(n.Data.Nod.Typ, n.Data.Nod.Value, ret.(node.ConstantNode))
@@ -387,24 +364,11 @@ func (r *Result) buildNode(n *Node) (ret node.Node) {
 			ret = node.New(constant.RETURN)
 		case "monadic":
 			ret = node.New(constant.MONADIC)
+			ret.(node.OperationNode).SetOperation(operation.This(n.Data.Nod.Operation))
 			switch n.Data.Nod.Operation {
-			case "convert":
+			case "CONV":
 				ret.(node.OperationNode).SetOperation(operation.CONVERT)
 				initType(n.Data.Nod.Typ, ret.(node.MonadicNode))
-			case "not":
-				ret.(node.OperationNode).SetOperation(operation.NOT)
-			case "is":
-				ret.(node.OperationNode).SetOperation(operation.IS)
-			case "abs":
-				ret.(node.OperationNode).SetOperation(operation.ABS)
-			case "odd":
-				ret.(node.OperationNode).SetOperation(operation.ODD)
-			case "cap":
-				ret.(node.OperationNode).SetOperation(operation.CAP)
-			case "bits":
-				ret.(node.OperationNode).SetOperation(operation.BITS)
-			default:
-				panic("no such operation " + n.Data.Nod.Operation)
 			}
 		case "conditional":
 			ret = node.New(constant.CONDITIONAL)