--- 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!