Browse Source

Patched issues with operator overloading and arrays of system.byte
todo: forbid passing of non-designators as array of byte

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6885 8c9fc860-2736-0410-a75d-ab315db34111

skoster 8 years ago
parent
commit
c6d103c0ad
1 changed files with 21 additions and 7 deletions
  1. 21 7
      source/FoxSemanticChecker.Mod

+ 21 - 7
source/FoxSemanticChecker.Mod

@@ -2432,6 +2432,7 @@ TYPE
 					result.SetType(type);
 					result.SetType(type);
 				ELSIF (type IS SyntaxTree.PortType) THEN
 				ELSIF (type IS SyntaxTree.PortType) THEN
 					result := ConvertValue(position, expression, system.integerType);
 					result := ConvertValue(position, expression, system.integerType);
+				
 				ELSE
 				ELSE
 					Error(position,Diagnostics.Invalid,"integer value cannot be converted");
 					Error(position,Diagnostics.Invalid,"integer value cannot be converted");
 					result := SyntaxTree.invalidExpression;
 					result := SyntaxTree.invalidExpression;
@@ -7457,7 +7458,7 @@ TYPE
 						IF CheckVariable(left) THEN
 						IF CheckVariable(left) THEN
 							IF inPort.direction # SyntaxTree.InPort THEN
 							IF inPort.direction # SyntaxTree.InPort THEN
 								Error(left.position,Diagnostics.Invalid,"not an in-port")
 								Error(left.position,Diagnostics.Invalid,"not an in-port")
-							ELSIF inPort.sizeInBits # system.SizeOf(right.type) THEN
+							ELSIF inPort.sizeInBits # system.SizeOf(left.type) THEN
 								Error(right.position,Diagnostics.Invalid,"incompatible to port type");
 								Error(right.position,Diagnostics.Invalid,"incompatible to port type");
 							END;
 							END;
 						END;
 						END;
@@ -9099,7 +9100,7 @@ TYPE
 	**)
 	**)
 	PROCEDURE Distance(system: Global.System; procedureType: SyntaxTree.ProcedureType; actualParameters: SyntaxTree.ExpressionList): LONGINT;
 	PROCEDURE Distance(system: Global.System; procedureType: SyntaxTree.ProcedureType; actualParameters: SyntaxTree.ExpressionList): LONGINT;
 	VAR result: LONGINT; formalParameter: SyntaxTree.Parameter; actualParameter: SyntaxTree.Expression;
 	VAR result: LONGINT; formalParameter: SyntaxTree.Parameter; actualParameter: SyntaxTree.Expression;
-	distance: LONGINT; baseFormal,baseActual: SyntaxTree.Type; i: LONGINT;
+	distance: LONGINT; baseFormal,baseActual, to: SyntaxTree.Type; i: LONGINT;
 	BEGIN
 	BEGIN
 		IF actualParameters.Length() # (procedureType.numberParameters) THEN
 		IF actualParameters.Length() # (procedureType.numberParameters) THEN
 			result := Infinity
 			result := Infinity
@@ -9110,6 +9111,10 @@ TYPE
 			(*! taken from paco, seems to not be 100% correct, check (in particular array part -> length of arrays??) *)
 			(*! taken from paco, seems to not be 100% correct, check (in particular array part -> length of arrays??) *)
 			WHILE (formalParameter # NIL) & (result # Infinity) DO
 			WHILE (formalParameter # NIL) & (result # Infinity) DO
 				actualParameter := actualParameters.GetExpression(i);
 				actualParameter := actualParameters.GetExpression(i);
+				
+				
+
+
 				ASSERT(formalParameter.type # NIL);
 				ASSERT(formalParameter.type # NIL);
 				IF (actualParameter.type = NIL) THEN distance := Infinity
 				IF (actualParameter.type = NIL) THEN distance := Infinity
 				ELSE
 				ELSE
@@ -9118,12 +9123,13 @@ TYPE
 				IF distance = Infinity THEN
 				IF distance = Infinity THEN
 					result := Infinity;
 					result := Infinity;
 				ELSE
 				ELSE
+					to := formalParameter.type.resolved; 
 					IF (formalParameter.kind = SyntaxTree.VarParameter) & (distance # 0) THEN
 					IF (formalParameter.kind = SyntaxTree.VarParameter) & (distance # 0) THEN
-						IF (formalParameter.type.resolved IS SyntaxTree.MathArrayType) & (actualParameter.type.resolved IS SyntaxTree.MathArrayType) THEN
+						IF (to IS SyntaxTree.MathArrayType) & (actualParameter.type.resolved IS SyntaxTree.MathArrayType) THEN
 							(* already handled varpar *)
 							(* already handled varpar *)
 							(*
 							(*
 							baseActual := actualParameter.type.resolved(SyntaxTree.MathArrayType).arrayBase.resolved;
 							baseActual := actualParameter.type.resolved(SyntaxTree.MathArrayType).arrayBase.resolved;
-							baseFormal := formalParameter.type.resolved(SyntaxTree.MathArrayType).arrayBase.resolved;
+							baseFormal := to(SyntaxTree.MathArrayType).arrayBase.resolved;
 							WHILE(baseActual IS SyntaxTree.MathArrayType) & (baseFormal IS SyntaxTree.MathArrayType) DO
 							WHILE(baseActual IS SyntaxTree.MathArrayType) & (baseFormal IS SyntaxTree.MathArrayType) DO
 								baseActual := baseActual(SyntaxTree.MathArrayType).arrayBase.resolved;
 								baseActual := baseActual(SyntaxTree.MathArrayType).arrayBase.resolved;
 								baseFormal := baseFormal(SyntaxTree.MathArrayType).arrayBase.resolved;
 								baseFormal := baseFormal(SyntaxTree.MathArrayType).arrayBase.resolved;
@@ -9132,9 +9138,12 @@ TYPE
 								result := Infinity
 								result := Infinity
 							END;
 							END;
 							*)
 							*)
-						ELSIF (formalParameter.type.resolved IS SyntaxTree.ArrayType) & (actualParameter.type.resolved IS SyntaxTree.ArrayType) THEN
+							INC(result, distance);
+						ELSIF (to IS SyntaxTree.ArrayType) & (to(SyntaxTree.ArrayType).length = NIL) & (to(SyntaxTree.ArrayType).arrayBase.resolved IS SyntaxTree.ByteType) THEN
+							INC(result, distance);
+						ELSIF (to IS SyntaxTree.ArrayType) & (actualParameter.type.resolved IS SyntaxTree.ArrayType) THEN
 							baseActual := actualParameter.type.resolved(SyntaxTree.ArrayType).arrayBase.resolved;
 							baseActual := actualParameter.type.resolved(SyntaxTree.ArrayType).arrayBase.resolved;
-							baseFormal := formalParameter.type.resolved(SyntaxTree.ArrayType).arrayBase.resolved;
+							baseFormal := to(SyntaxTree.ArrayType).arrayBase.resolved;
 							WHILE(baseActual IS SyntaxTree.ArrayType) & (baseFormal IS SyntaxTree.ArrayType) DO
 							WHILE(baseActual IS SyntaxTree.ArrayType) & (baseFormal IS SyntaxTree.ArrayType) DO
 								baseActual := baseActual(SyntaxTree.ArrayType).arrayBase.resolved;
 								baseActual := baseActual(SyntaxTree.ArrayType).arrayBase.resolved;
 								baseFormal := baseFormal(SyntaxTree.ArrayType).arrayBase.resolved;
 								baseFormal := baseFormal(SyntaxTree.ArrayType).arrayBase.resolved;
@@ -9149,6 +9158,11 @@ TYPE
 						INC(result,distance);
 						INC(result,distance);
 					END;
 					END;
 				END;
 				END;
+				(*
+				Printout.Info("actual=", actualParameter);
+				Printout.Info("formal=", formalParameter);
+				TRACE(result);
+				*)
 				formalParameter := formalParameter.nextParameter; INC(i);
 				formalParameter := formalParameter.nextParameter; INC(i);
 			END;
 			END;
 		END;
 		END;
@@ -9200,7 +9214,7 @@ TYPE
 		ELSIF (from IS SyntaxTree.NilType) OR (to IS SyntaxTree.NilType) THEN
 		ELSIF (from IS SyntaxTree.NilType) OR (to IS SyntaxTree.NilType) THEN
 			i := Infinity;
 			i := Infinity;
 		ELSIF (to IS SyntaxTree.ArrayType) & (to(SyntaxTree.ArrayType).length = NIL) & (to(SyntaxTree.ArrayType).arrayBase.resolved IS SyntaxTree.ByteType) THEN
 		ELSIF (to IS SyntaxTree.ArrayType) & (to(SyntaxTree.ArrayType).length = NIL) & (to(SyntaxTree.ArrayType).arrayBase.resolved IS SyntaxTree.ByteType) THEN
-			i := 1
+			i := 10;
 		ELSIF (from IS SyntaxTree.StringType) THEN
 		ELSIF (from IS SyntaxTree.StringType) THEN
 			IF (to IS SyntaxTree.ArrayType) & (to(SyntaxTree.ArrayType).length = NIL) & (to(SyntaxTree.ArrayType).arrayBase.resolved  IS SyntaxTree.CharacterType) THEN  i := 1  END
 			IF (to IS SyntaxTree.ArrayType) & (to(SyntaxTree.ArrayType).length = NIL) & (to(SyntaxTree.ArrayType).arrayBase.resolved  IS SyntaxTree.CharacterType) THEN  i := 1  END
 		ELSIF (from IS SyntaxTree.CharacterType) THEN
 		ELSIF (from IS SyntaxTree.CharacterType) THEN