|
@@ -1,85 +1,62 @@
|
|
MODULE EberonOperatorScopes;
|
|
MODULE EberonOperatorScopes;
|
|
IMPORT
|
|
IMPORT
|
|
- ContextHierarchy,
|
|
|
|
- EberonContextDesignator, EberonContextProcedure, EberonScope,
|
|
|
|
- EberonTypePromotion,
|
|
|
|
- Scope;
|
|
|
|
|
|
+ ContextHierarchy, EberonContextTypePromotion, EberonScope, Scope;
|
|
TYPE
|
|
TYPE
|
|
|
|
+ PRoot = POINTER TO ContextHierarchy.Root;
|
|
|
|
+
|
|
Type* = RECORD
|
|
Type* = RECORD
|
|
- PROCEDURE Type*(cx: ContextHierarchy.PNode);
|
|
|
|
|
|
+ PROCEDURE Type*(cx: PRoot);
|
|
|
|
|
|
PROCEDURE handleMessage*(VAR msg: ContextHierarchy.Message): BOOLEAN;
|
|
PROCEDURE handleMessage*(VAR msg: ContextHierarchy.Message): BOOLEAN;
|
|
PROCEDURE doThen*();
|
|
PROCEDURE doThen*();
|
|
PROCEDURE alternate*();
|
|
PROCEDURE alternate*();
|
|
PROCEDURE reset*();
|
|
PROCEDURE reset*();
|
|
|
|
|
|
- context: ContextHierarchy.PNode;
|
|
|
|
|
|
+ root: PRoot;
|
|
|
|
+ typePromotion: EberonContextTypePromotion.Type;
|
|
scope: Scope.PType;
|
|
scope: Scope.PType;
|
|
- ignorePromotions: BOOLEAN;
|
|
|
|
- typePromotion: EberonTypePromotion.PType;
|
|
|
|
- typePromotions: ARRAY * OF EberonTypePromotion.PType;
|
|
|
|
END;
|
|
END;
|
|
|
|
+ PType* = POINTER TO Type;
|
|
|
|
|
|
-PROCEDURE Type.Type(cx: ContextHierarchy.PNode)
|
|
|
|
- | context(cx);
|
|
|
|
|
|
+PROCEDURE newScope(root: PRoot): Scope.PType;
|
|
BEGIN
|
|
BEGIN
|
|
- SELF.alternate();
|
|
|
|
-END;
|
|
|
|
|
|
+ scope <- EberonScope.makeOperator(
|
|
|
|
+ root.currentScope(),
|
|
|
|
+ root.language().stdSymbols);
|
|
|
|
+ root.pushScope(scope);
|
|
|
|
+ RETURN scope;
|
|
|
|
+END;
|
|
|
|
|
|
-PROCEDURE Type.handleMessage(VAR msg: ContextHierarchy.Message): BOOLEAN;
|
|
|
|
|
|
+PROCEDURE Type.Type(root: PRoot)
|
|
|
|
+ | root(root),
|
|
|
|
+ scope(newScope(root));
|
|
BEGIN
|
|
BEGIN
|
|
- result <- FALSE;
|
|
|
|
|
|
+END;
|
|
|
|
|
|
- IF SELF.ignorePromotions THEN
|
|
|
|
- ELSIF msg IS EberonContextDesignator.TransferPromotedTypesMsg THEN
|
|
|
|
- result := TRUE;
|
|
|
|
- ELSIF msg IS EberonContextDesignator.PromoteTypeMsg THEN
|
|
|
|
- SELF.typePromotion := NEW EberonTypePromotion.ForVariable(msg.info, msg.type, FALSE);
|
|
|
|
- SELF.typePromotions.add(SELF.typePromotion);
|
|
|
|
- result := TRUE;
|
|
|
|
- ELSIF msg IS EberonContextProcedure.BeginTypePromotionOrMsg THEN
|
|
|
|
- tp <- NEW EberonTypePromotion.Or(FALSE);
|
|
|
|
- SELF.typePromotion := tp;
|
|
|
|
- SELF.typePromotions.add(tp);
|
|
|
|
- msg.result := tp;
|
|
|
|
- result := TRUE;
|
|
|
|
- END;
|
|
|
|
- RETURN result;
|
|
|
|
|
|
+PROCEDURE Type.handleMessage(VAR msg: ContextHierarchy.Message): BOOLEAN;
|
|
|
|
+ RETURN SELF.typePromotion.handleMessage(msg);
|
|
END;
|
|
END;
|
|
|
|
|
|
PROCEDURE Type.doThen();
|
|
PROCEDURE Type.doThen();
|
|
BEGIN
|
|
BEGIN
|
|
- IF SELF.typePromotion # NIL THEN
|
|
|
|
- SELF.typePromotion.and();
|
|
|
|
- END;
|
|
|
|
- SELF.ignorePromotions := TRUE;
|
|
|
|
|
|
+ SELF.typePromotion.doThen();
|
|
END;
|
|
END;
|
|
|
|
|
|
PROCEDURE Type.alternate();
|
|
PROCEDURE Type.alternate();
|
|
BEGIN
|
|
BEGIN
|
|
- root <- SELF.context.root();
|
|
|
|
|
|
+ root <- SELF.root;
|
|
IF SELF.scope # NIL THEN
|
|
IF SELF.scope # NIL THEN
|
|
root.popScope();
|
|
root.popScope();
|
|
END;
|
|
END;
|
|
- SELF.scope := EberonScope.makeOperator(
|
|
|
|
- root.currentScope(),
|
|
|
|
- root.language().stdSymbols);
|
|
|
|
- root.pushScope(SELF.scope);
|
|
|
|
|
|
+ SELF.scope := newScope(root);
|
|
|
|
|
|
- IF SELF.typePromotion # NIL THEN
|
|
|
|
- SELF.typePromotion.reset();
|
|
|
|
- SELF.typePromotion.or();
|
|
|
|
- SELF.typePromotion := NIL;
|
|
|
|
- END;
|
|
|
|
- SELF.ignorePromotions := FALSE;
|
|
|
|
|
|
+ SELF.typePromotion.alternate();
|
|
END;
|
|
END;
|
|
|
|
|
|
PROCEDURE Type.reset();
|
|
PROCEDURE Type.reset();
|
|
BEGIN
|
|
BEGIN
|
|
- SELF.context.root().popScope();
|
|
|
|
- FOR p IN SELF.typePromotions DO
|
|
|
|
- p.reset();
|
|
|
|
- END;
|
|
|
|
|
|
+ SELF.root.popScope();
|
|
|
|
+ SELF.typePromotion.reset();
|
|
END;
|
|
END;
|
|
|
|
|
|
END EberonOperatorScopes.
|
|
END EberonOperatorScopes.
|