allow enable/disable of constantFolding
authorClaus Gittinger <cg@exept.de>
Fri, 09 Feb 1996 18:38:36 +0100
changeset 210 b22f4472833b
parent 209 b858b6a6880f
child 211 1fd13827a2fc
allow enable/disable of constantFolding
Parser.st
--- a/Parser.st	Fri Feb 09 17:18:09 1996 +0100
+++ b/Parser.st	Fri Feb 09 18:38:36 1996 +0100
@@ -21,7 +21,7 @@
 		warnedUndefVars warnSTXHereExtensionUsed correctedSource'
 	classVariableNames:'PrevClass PrevInstVarNames PrevClassVarNames
 		PrevClassInstVarNames LazyCompilation ArraysAreImmutable
-		ImplicitSelfSends WarnST80Directives'
+		ImplicitSelfSends WarnST80Directives FoldConstants'
 	poolDictionaries:''
 	category:'System-Compiler'
 !
@@ -240,6 +240,22 @@
     "
 !
 
+foldConstants
+    "return true if constant folding is enabled"
+
+    ^ FoldConstants
+
+    "Created: 9.2.1996 / 17:40:13 / cg"
+!
+
+foldConstants:aBoolean
+    "enable/disable constant folding"
+
+    FoldConstants := aBoolean
+
+    "Created: 9.2.1996 / 17:40:34 / cg"
+!
+
 implicitSelfSends
     "return true if undefined variables with
      lowercase first character are to be turned
@@ -570,6 +586,9 @@
     ArraysAreImmutable := false.   "/ usually left true for ST-80 compatibility
     ImplicitSelfSends := false.
     WarnST80Directives := false.
+    FoldConstants := true.
+
+    "Modified: 9.2.1996 / 17:33:49 / cg"
 ! !
 
 !Parser class methodsFor:'parsing'!
@@ -1783,41 +1802,43 @@
 
     [(tokenType == #BinaryOperator) or:[(tokenType == $|)
      or:[(tokenType == #Integer) and:[tokenValue < 0]]]] whileTrue:[
-	pos := tokenPosition.
-
-	lno := tokenLineNr.
-
-	"kludge here: bar and minus are not scanned as binop "
-	(tokenType == $|) ifTrue:[
-	    sel := '|'.
-	    self nextToken
-	] ifFalse:[
-	    (tokenType == #BinaryOperator) ifTrue:[
-		sel := self selectorCheck:tokenName for:receiver position:tokenPosition to:(tokenPosition + tokenName size - 1).
-		self nextToken
-	    ] ifFalse:[
-		sel := '-'.
-		tokenValue := tokenValue negated
-	    ]
-	].
-	arg := self unaryExpression.
-	(arg == #Error) ifTrue:[^ #Error].
-	try := BinaryNode receiver:receiver selector:sel arg:arg.
-	(try isMemberOf:String) ifTrue:[
-	    self parseError:try position:pos to:tokenPosition.
-	    errorFlag := false. "ok, user wants it - so he'll get it"
-	    receiver := BinaryNode receiver:receiver selector:sel arg:arg fold:false.
-	    note := receiver plausibilityCheck.
-	    note notNil ifTrue:[
-		self warning:note position:pos to:tokenPosition
-	    ].
-	] ifFalse:[
-	    receiver := try
-	].
-	receiver lineNumber:lno.
-	parseForCode ifFalse:[self rememberSelectorUsed:sel].
+        pos := tokenPosition.
+
+        lno := tokenLineNr.
+
+        "kludge here: bar and minus are not scanned as binop "
+        (tokenType == $|) ifTrue:[
+            sel := '|'.
+            self nextToken
+        ] ifFalse:[
+            (tokenType == #BinaryOperator) ifTrue:[
+                sel := self selectorCheck:tokenName for:receiver position:tokenPosition to:(tokenPosition + tokenName size - 1).
+                self nextToken
+            ] ifFalse:[
+                sel := '-'.
+                tokenValue := tokenValue negated
+            ]
+        ].
+        arg := self unaryExpression.
+        (arg == #Error) ifTrue:[^ #Error].
+        try := BinaryNode receiver:receiver selector:sel arg:arg fold:FoldConstants.
+        (try isMemberOf:String) ifTrue:[
+            self parseError:try position:pos to:tokenPosition.
+            errorFlag := false. "ok, user wants it - so he'll get it"
+            receiver := BinaryNode receiver:receiver selector:sel arg:arg fold:false.
+            note := receiver plausibilityCheck.
+            note notNil ifTrue:[
+                self warning:note position:pos to:tokenPosition
+            ].
+        ] ifFalse:[
+            receiver := try
+        ].
+        receiver lineNumber:lno.
+        parseForCode ifFalse:[self rememberSelectorUsed:sel].
     ].
     ^ receiver
+
+    "Modified: 9.2.1996 / 17:39:39 / cg"
 !
 
 block
@@ -2181,7 +2202,7 @@
     "parse a keyword-expression; return a node-tree, nil or #Error.
 
      keywordExpression ::= binaryexpression
-			   | { KEYWORD-PART binaryExpression }
+                           | { KEYWORD-PART binaryExpression }
     "
 
     |receiver sel arg args pos1 pos2 try lno note|
@@ -2189,39 +2210,41 @@
     receiver := self binaryExpression.
     (receiver == #Error) ifTrue:[^ #Error].
     (tokenType == #Keyword) ifTrue:[
-	pos1 := tokenPosition.
-	pos2 := tokenPosition + tokenName size - 1.
-	sel := tokenName.
-	lno := tokenLineNr.
-	self nextToken.
-	arg := self binaryExpression.
-	(arg == #Error) ifTrue:[^ #Error].
-	args := Array with:arg.
-	[tokenType == #Keyword] whileTrue:[
-	    sel := sel , tokenName.
-	    pos2 := tokenPosition + tokenName size - 1.
-	    self nextToken.
-	    arg := self binaryExpression.
-	    (arg == #Error) ifTrue:[^ #Error].
-	    args := args copyWith:arg.
-	].
-	sel := self selectorCheck:sel for:receiver position:pos1 to:pos2.
-	try := MessageNode receiver:receiver selector:sel args:args.
-	(try isMemberOf:String) ifTrue:[
-	    self parseError:try position:pos1 to:pos2.
-	    errorFlag := false. "ok, user wants it - so he'll get it"
-	    receiver := MessageNode receiver:receiver selector:sel args:args fold:false.
-	    note := receiver plausibilityCheck.
-	    note notNil ifTrue:[
-		self warning:note position:pos1 to:pos2
-	    ].
-	] ifFalse:[
-	    receiver := try
-	].
-	receiver lineNumber:lno.
-	parseForCode ifFalse:[self rememberSelectorUsed:sel].
+        pos1 := tokenPosition.
+        pos2 := tokenPosition + tokenName size - 1.
+        sel := tokenName.
+        lno := tokenLineNr.
+        self nextToken.
+        arg := self binaryExpression.
+        (arg == #Error) ifTrue:[^ #Error].
+        args := Array with:arg.
+        [tokenType == #Keyword] whileTrue:[
+            sel := sel , tokenName.
+            pos2 := tokenPosition + tokenName size - 1.
+            self nextToken.
+            arg := self binaryExpression.
+            (arg == #Error) ifTrue:[^ #Error].
+            args := args copyWith:arg.
+        ].
+        sel := self selectorCheck:sel for:receiver position:pos1 to:pos2.
+        try := MessageNode receiver:receiver selector:sel args:args fold:FoldConstants.
+        (try isMemberOf:String) ifTrue:[
+            self parseError:try position:pos1 to:pos2.
+            errorFlag := false. "ok, user wants it - so he'll get it"
+            receiver := MessageNode receiver:receiver selector:sel args:args fold:false.
+            note := receiver plausibilityCheck.
+            note notNil ifTrue:[
+                self warning:note position:pos1 to:pos2
+            ].
+        ] ifFalse:[
+            receiver := try
+        ].
+        receiver lineNumber:lno.
+        parseForCode ifFalse:[self rememberSelectorUsed:sel].
     ].
     ^ receiver
+
+    "Modified: 9.2.1996 / 17:35:21 / cg"
 !
 
 parseMethod
@@ -2886,22 +2909,24 @@
     receiver := self primary.
     (receiver == #Error) ifTrue:[^ #Error].
     [tokenType == #Identifier] whileTrue:[
-	pos := tokenPosition.
-	pos2 := pos + tokenName size - 1.
-	sel := self selectorCheck:tokenName for:receiver position:pos to:pos2.
-	try := UnaryNode receiver:receiver selector:sel.
-	(try isMemberOf:String) ifTrue:[
-	    self parseError:try position:pos to:pos2.
-	    errorFlag := false. "ok, user wants it - so he'll get it"
-	    receiver := UnaryNode receiver:receiver selector:sel fold:false.
-	] ifFalse:[
-	    receiver := try
-	].
-	receiver lineNumber:tokenLineNr.
-	parseForCode ifFalse:[self rememberSelectorUsed:sel].
-	self nextToken.
+        pos := tokenPosition.
+        pos2 := pos + tokenName size - 1.
+        sel := self selectorCheck:tokenName for:receiver position:pos to:pos2.
+        try := UnaryNode receiver:receiver selector:sel fold:FoldConstants.
+        (try isMemberOf:String) ifTrue:[
+            self parseError:try position:pos to:pos2.
+            errorFlag := false. "ok, user wants it - so he'll get it"
+            receiver := UnaryNode receiver:receiver selector:sel fold:false.
+        ] ifFalse:[
+            receiver := try
+        ].
+        receiver lineNumber:tokenLineNr.
+        parseForCode ifFalse:[self rememberSelectorUsed:sel].
+        self nextToken.
     ].
     ^ receiver
+
+    "Modified: 9.2.1996 / 17:35:05 / cg"
 !
 
 variable
@@ -3273,6 +3298,6 @@
 !Parser class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.67 1996-02-08 21:04:55 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.68 1996-02-09 17:38:36 cg Exp $'
 ! !
 Parser initialize!