浏览代码

removed visitor pattern completely now
- replaced with slightly optimized WITH cascades in visitor procedures, no indirect call
- treat inherited types like tagged unions

reasons:
- wanted to replace indirection with more straightforward, better readable forward code;
- plan to replace object variables by local variables
- plan for optimizations that can hopefully be easier implemented without the visitor pattern

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

felixf 6 年之前
父节点
当前提交
0d1a0813c5

+ 2 - 2
source/FoxDocumentationBackend.Mod

@@ -475,7 +475,7 @@ TYPE
 		PROCEDURE Expression*(x: SyntaxTree.Expression);
 		BEGIN
 			IF x # NIL THEN
-				x.Accept(SELF);
+				VExpression(x);
 			END;
 			w.Update;
 		END Expression;
@@ -757,7 +757,7 @@ TYPE
 
 		PROCEDURE Symbol*(x: SyntaxTree.Symbol);
 		BEGIN
-			IF Visible(x) THEN x.Accept(SELF) END
+			IF Visible(x) THEN VSymbol(x) END
 		END Symbol;
 
 		PROCEDURE NeedsSection(x: SyntaxTree.Symbol): BOOLEAN;

+ 3 - 3
source/FoxFingerPrinter.Mod

@@ -872,9 +872,9 @@ TYPE
 		BEGIN
 			SELF.fp := fp;
 			IF x.resolved # NIL THEN
-				x.resolved.Accept(SELF);
+				VExpression(x.resolved);
 			ELSE
-				x.Accept(SELF)
+				VExpression(x);
 			END;
 			fp := SELF.fp
 		END FPValue;
@@ -1302,7 +1302,7 @@ TYPE
 				D.Str("name: ");
 				D.Str0(this.name); D.Ln;
 			END;
-			this.Accept(SELF);
+			VSymbol(this);
 			SELF.deep := deep;
 			IF Trace THEN TraceExit("SymbolFP",fingerprint); D.Ln; END;
 			RETURN fingerprint

+ 7 - 7
source/FoxIntermediateBackend.Mod

@@ -1656,18 +1656,18 @@ TYPE
 					Printout.Info("mapping from", x);
 					Printout.Info("mapping to ", m.to);
 					*)
-					m.to.Accept(SELF);
+					VExpression(m.to);
 					op := result;
 					IF m.tag # NIL THEN
 						ReleaseIntermediateOperand(result.tag);
-						m.tag.Accept(SELF);
+						VExpression(m.tag);
 						op.tag := result.op;
 						ReleaseIntermediateOperand(result.tag);
 					END;
 					RETURN
 				END;
 			END;
-			x.Accept(SELF);
+			VSymbol(x);
 			op := result;
 		END Symbol;
 
@@ -1679,9 +1679,9 @@ TYPE
 				constantDeclaration := x(SyntaxTree.SymbolDesignator).symbol;
 			END;
 			IF x.resolved # NIL THEN
-				x.resolved.Accept(SELF)
+				VExpression(x.resolved);
 			ELSE
-				x.Accept(SELF)
+				VExpression(x);
 			END;
 			(* check this, was commented out in ActiveCells3 *)
 			IF (x IS SyntaxTree.Designator) & (x(SyntaxTree.Designator).modifiers # NIL) & ~backend.cellsAreObjects THEN
@@ -1726,7 +1726,7 @@ TYPE
 				dump.Ln;
 				(*dump.Update;*)
 			END;
-			x.Accept(SELF);
+			VStatement(x);
 			(*
 			CheckRegistersFree();
 			*)
@@ -9584,7 +9584,7 @@ TYPE
 		PROCEDURE VisitConstant*(x: SyntaxTree.Constant);
 		BEGIN
 			constantDeclaration := x;
-			x.value.resolved.Accept(SELF);
+			VExpression(x.value.resolved);
 		END VisitConstant;
 
 		PROCEDURE VisitRealValue*(x: SyntaxTree.RealValue);

+ 4 - 4
source/FoxInterpreter.Mod

@@ -975,7 +975,7 @@ TYPE
 			ELSE
 				call := x.call;
 			END;
-			call.Accept(SELF);
+			VExpression(call);
 		END VisitProcedureCallStatement;
 
 		PROCEDURE LoadValue;
@@ -1038,7 +1038,7 @@ TYPE
 
 		PROCEDURE PutValue(x: SyntaxTree.Designator; v: Value);
 		BEGIN
-			x.Accept(SELF);
+			VExpression(x);
 			IF (item.object # NIL) & item.object(Result).SetV(v) THEN
 			ELSIF (item.in # NIL) & (item.name # 0) & (item.in IS Container) THEN
 				item.in(Container).Enter1(v, item.name);
@@ -1176,13 +1176,13 @@ TYPE
 		PROCEDURE Expression(x: SyntaxTree.Expression);
 		BEGIN
 			value := FALSE;
-			x.Accept(SELF);			
+			VExpression(x);
 		END Expression;
 		
 		PROCEDURE Statement*(x: SyntaxTree.Statement);
 		BEGIN
 			item.object := NIL;
-			x.Accept(SELF);
+			VStatement(x);
 		END Statement;
 
 		PROCEDURE StatementSequence*(x: SyntaxTree.StatementSequence);

+ 3 - 3
source/FoxPrintout.Mod

@@ -475,7 +475,7 @@ TYPE
 			IF x = NIL THEN
 				AlertString("nil expression");
 			ELSE
-				x.Accept(SELF);
+				VExpression(x);
 				IF info & (x.resolved # NIL) & (x.resolved # x) THEN
 					BeginComment; w.String("value = "); Expression(x.resolved); EndComment;
 				END;
@@ -909,7 +909,7 @@ TYPE
 			IF x = NIL THEN
 				AlertString("nil symbol");
 			ELSE
-				x.Accept(SELF);
+				VSymbol(x);
 			END
 		END Symbol;
 
@@ -1498,7 +1498,7 @@ TYPE
 			ELSE
 				Comments(x.comment, x, FALSE);
 				IF DebugPosition THEN TRACE(x.position.start, x.position.end, x.end.start, x.end.end) END;
-				x.Accept(SELF);
+				VStatement(x);
 				Comments(x.comment,x,TRUE);
 			END
 		END Statement;

+ 3 - 3
source/FoxSemanticChecker.Mod

@@ -6535,7 +6535,7 @@ TYPE
 				IF ~(expression IS SyntaxTree.BuiltinCallDesignator) THEN
 					expression.SetType(SyntaxTree.invalidType);
 				END;
-				expression.Accept(SELF);
+				VExpression(expression);
 				result := resolvedExpression;
 				IF currentIsRealtime THEN
 					IF (result.type # NIL) & ~result.type.resolved.isRealtime THEN
@@ -6636,7 +6636,7 @@ TYPE
 
 		PROCEDURE ResolveSymbol(x: SyntaxTree.Symbol);
 		BEGIN
-			x.Accept(SELF);
+			VSymbol(x);
 		END ResolveSymbol;
 
 		(** check a symbol
@@ -7430,7 +7430,7 @@ TYPE
 			resolvedStatement := x;
 			IF currentIsUnreachable THEN x.SetUnreachable(TRUE) END;
 			activeCellsStatement := FALSE;
-			x.Accept(SELF);
+			VStatement(x);
 			(* removed this, implementation restriction should be resolved by backend
 			IF (inCellNetBody) & (activeCellsStatement = FALSE) THEN
 				Error(x.position, "non-activeCells statement in activeCells block - not yet implemented");

文件差异内容过多而无法显示
+ 0 - 407
source/FoxSyntaxTree.Mod


+ 3 - 2
source/FoxTranspilerBackend.Mod

@@ -921,11 +921,12 @@ TYPE
 		BEGIN
 			ASSERT (statement # NIL);
 			PrintComments (statement.comment, statement);
-			statement.Accept (SELF);
+			VStatement(statement);
 		END PrintStatement;
 
 		PROCEDURE PrintExpression (expression: SyntaxTree.Expression);
-		BEGIN ASSERT (expression # NIL); expression.Accept (SELF);
+		BEGIN ASSERT (expression # NIL); 
+			VExpression(expression);
 		END PrintExpression;
 
 		PROCEDURE PrintNegatedExpression (expression: SyntaxTree.Expression);

部分文件因为文件数量过多而无法显示