Browse Source

js -> eberon transition

Vladislav Folts 10 years ago
parent
commit
4c7882cf3e

BIN
bin/compiled.zip


+ 4 - 5
build.py

@@ -127,11 +127,10 @@ def run_tests(bin, unit_test=None, code_test=None):
 def recompile(bin):
     print('recompile oberon sources using "%s"...' % bin)
     compiler = os.path.join(root, 'src', 'oc_nodejs.js')
-    sources = ['ContextAssignment.ob', 'ContextCase.ob', 
-               'ContextIdentdef.ob', 'ContextModule.ob', 
-               'EberonSymbols.ob', 'EberonCast.ob', 
-               'EberonContextCase.ob', 'EberonContextExpression.ob', 'EberonContextIdentdef.ob', 'EberonContextIf.ob', 
-               'EberonContextInPlace.ob', 'EberonContextLoop.ob', 'EberonContextType.ob', 
+    sources = ['ContextAssignment.ob', 
+               'EberonSymbols.ob', 
+               'EberonContextCase.ob', 'EberonContextExpression.ob', 'EberonContextIdentdef.ob', 
+               'EberonContextIf.ob', 'EberonContextInPlace.ob', 'EberonContextType.ob', 
                'EberonContextVar.ob',
                'OberonContext.ob', 'OberonContextType.ob', 'OberonContextVar.ob',
                'OberonSymbols.ob', 'Lexer.ob', 'Module.ob']

+ 16 - 2
src/eberon/EberonContextProcedure.ob

@@ -1,7 +1,8 @@
 MODULE EberonContextProcedure;
 IMPORT
     Chars, CodeGenerator,
-    Context, ContextDesignator, ContextExpression, ContextHierarchy, ContextProcedure, ContextType, 
+    Context, ContextDesignator, ContextExpression, ContextHierarchy, ContextModule, 
+    ContextProcedure, ContextType, 
     EberonConstructor, EberonContext, EberonContextDesignator, 
     EberonDynamicArray, EberonRecord, EberonTypePromotion, EberonTypes,
     Errors, Expression, LanguageContext, Object, Procedure, Types;
@@ -37,6 +38,9 @@ TYPE
     FormalParametersProcDecl* = RECORD(ContextProcedure.FormalParametersProcDecl)
     END;
 
+    ModuleDeclaration* = RECORD(ContextModule.Declaration)
+    END;
+
     GetConstructorBoundTypeMsg = RECORD(ContextHierarchy.Message)
     END;
     GetConstructorSuperMsg = RECORD(ContextHierarchy.Message)
@@ -107,7 +111,7 @@ BEGIN
     RETURN EberonConstructor.makeFieldInitCall(type, ContextHierarchy.makeLanguageContext(d), id);
 END;
 
-PROCEDURE handleTypePromotionMadeInSeparateStatement*(VAR msg: ContextHierarchy.Message): BOOLEAN;
+PROCEDURE handleTypePromotionMadeInSeparateStatement(VAR msg: ContextHierarchy.Message): BOOLEAN;
 BEGIN
     result <- FALSE;
     IF EberonContextDesignator.breakTypePromotion(msg) THEN
@@ -404,6 +408,16 @@ BEGIN
     END;
 END;
 
+PROCEDURE ModuleDeclaration.handleMessage(VAR msg: ContextHierarchy.Message): Object.PType;
+VAR
+    result: Object.PType;
+BEGIN
+    IF ~handleTypePromotionMadeInSeparateStatement(msg) THEN
+        result := SUPER(msg);
+    END;
+    RETURN result;
+END;
+
 PROCEDURE InitFieldMsg.InitFieldMsg(id: STRING)
     | id(id);
 END;

+ 28 - 0
src/eberon/EberonContextType.ob

@@ -12,6 +12,11 @@ TYPE
     END;
     PDeclaration = POINTER TO Declaration;
 
+    FormalType* = RECORD(ContextType.HandleSymbolAsType)
+        arrayDimensions: ARRAY * OF BOOLEAN;
+        dynamicDimension: BOOLEAN;
+    END;
+
     Record* = RECORD(ContextType.Record)
         PROCEDURE Record*(parent: PDeclaration);
     END;
@@ -47,6 +52,29 @@ BEGIN
     SUPER(id);
 END;
 
+PROCEDURE FormalType.setType(type: Types.PStorageType);
+BEGIN
+    result <- type;
+    FOR i <- LEN(SELF.arrayDimensions) - 1 TO 0 BY -1 DO
+        IF SELF.arrayDimensions[i] THEN
+            result := NEW EberonDynamicArray.DynamicArray(result);
+        ELSE
+            result := SELF.root().language().types.makeOpenArray(result);
+        END;
+    END;
+    SELF.parent()^(ContextType.HandleSymbolAsType).setType(result);
+END;
+
+PROCEDURE FormalType.handleLiteral(s: STRING);
+BEGIN
+    IF s = "*" THEN
+        SELF.dynamicDimension := TRUE;
+    ELSIF s = "OF" THEN
+        SELF.arrayDimensions.add(SELF.dynamicDimension);
+        SELF.dynamicDimension := FALSE;
+    END;
+END;
+
 PROCEDURE recordTypeFactory(name, cons: STRING; scope: ScopeBase.PType): R.PType;
     RETURN NEW EberonRecord.Record(name, cons, scope);
 END;

+ 0 - 94
src/eberon/eberon_context.js

@@ -1,94 +0,0 @@
-"use strict";
-
-var Cast = require("js/Cast.js");
-var Class = require("rtl.js").Class;
-var Code = require("js/Code.js");
-var CodeGenerator = require("js/CodeGenerator.js");
-var ContextCase = require("js/ContextCase.js");
-var ContextConst = require("js/ContextConst.js");
-var ContextDesignator = require("js/ContextDesignator.js");
-var ContextExpression = require("js/ContextExpression.js");
-var ContextIdentdef = require("js/ContextIdentdef.js");
-var ContextIf = require("js/ContextIf.js");
-var ContextLoop = require("js/ContextLoop.js");
-var ContextModule = require("js/ContextModule.js");
-var ContextHierarchy = require("js/ContextHierarchy.js");
-var ContextProcedure = require("js/ContextProcedure.js");
-var ContextType = require("js/ContextType.js");
-var ContextVar = require("js/ContextVar.js");
-var EberonConstructor = require("js/EberonConstructor.js");
-var EberonContext = require("js/EberonContext.js");
-var EberonContextDesignator = require("js/EberonContextDesignator.js");
-var EberonContextExpression = require("js/EberonContextExpression.js");
-var EberonContextProcedure = require("js/EberonContextProcedure.js");
-var EberonContextType = require("js/EberonContextType.js");
-var EberonDynamicArray = require("js/EberonDynamicArray.js");
-var EberonMap = require("js/EberonMap.js");
-var EberonOperatorScopes = require("js/EberonOperatorScopes.js");
-var EberonRecord = require("js/EberonRecord.js");
-var EberonScope = require("js/EberonScope.js");
-var EberonString = require("js/EberonString.js");
-var EberonTypes = require("js/EberonTypes.js");
-var Errors = require("js/Errors.js");
-var Expression = require("js/Expression.js");
-var Module = require("js/Module.js");
-var op = require("js/Operator.js");
-var eOp = require("js/EberonOperator.js");
-var Symbol = require("js/Symbols.js");
-var Procedure = require("js/Procedure.js");
-var Record = require("js/Record.js");
-var Type = require("js/Types.js");
-var TypeId = require("js/TypeId.js");
-var TypePromotion = require("js/EberonTypePromotion.js");
-var Variable = require("js/Variable.js");
-
-/*
-function log(s){
-    console.info(s);
-}
-*/
-
-var ChainedContext = ContextHierarchy.Node;
-ChainedContext.extend = Class.extend;
-ChainedContext.prototype.init = ContextHierarchy.Node;
-
-var FormalType = Class.extend.call(ContextType.HandleSymbolAsType, {
-    init: function EberonContext$FormalType(context){
-        ContextType.HandleSymbolAsType.call(this, context);
-        this.__arrayDimensions = [];
-        this.__dynamicDimension = false;
-    },
-    setType: function(type){           
-        function makeDynamic(type){return new EberonDynamicArray.DynamicArray(type); }
-
-        for(var i = this.__arrayDimensions.length; i--;){
-            var cons = this.__arrayDimensions[i]
-                ? makeDynamic
-                : this.root().language().types.makeOpenArray;
-            type = cons(type);
-        }
-        this.parent().setType(type);
-    },
-    handleLiteral: function(s){
-        if (s == "*")
-            this.__dynamicDimension = true;
-        else if ( s == "OF"){
-            this.__arrayDimensions.push(this.__dynamicDimension);
-            this.__dynamicDimension = false;
-        }
-    }
-});
-
-var ModuleDeclaration = Class.extend.call(ContextModule.Declaration, {
-    init: function EberonContext$ModuleDeclaration(context){
-        ContextModule.Declaration.call(this, context);
-    },
-    handleMessage: function(msg){
-        if (EberonContextProcedure.handleTypePromotionMadeInSeparateStatement(msg))
-            return;
-        return ContextModule.Declaration.prototype.handleMessage.call(this, msg);
-    }
-});
-
-exports.FormalType = FormalType;
-exports.ModuleDeclaration = ModuleDeclaration;

+ 2 - 3
src/eberon/eberon_grammar.js

@@ -4,7 +4,6 @@ var Cast = require("js/EberonCast.js");
 var EbArray = require("js/EberonArray.js");
 var CodeGenerator = require("js/CodeGenerator.js");
 var ContextType = require("js/ContextType.js");
-var EbContext = require("eberon/eberon_context.js");
 var EberonContext = require("js/EberonContext.js");
 var EberonContextCase = require("js/EberonContextCase.js");
 var EberonContextDesignator = require("js/EberonContextDesignator.js");
@@ -156,7 +155,7 @@ exports.language = {
             ArrayDecl:          EberonContextType.Array,
             Factor:             EberonContextExpression.Factor,
             FormalParameters:   EberonContextProcedure.FormalParameters,
-            FormalType:         EbContext.FormalType,
+            FormalType:         EberonContextType.FormalType,
             Term:               EberonContextExpression.Term,
             AddOperator:        EberonContextExpression.AddOperator,
             MulOperator:        EberonContextExpression.MulOperator,
@@ -167,7 +166,7 @@ exports.language = {
             If:                 EberonContextIf.Type,
             CaseLabel:          EberonContextCase.Label,
             Repeat:             EberonContextLoop.Repeat,
-            ModuleDeclaration:  EbContext.ModuleDeclaration
+            ModuleDeclaration:  EberonContextProcedure.ModuleDeclaration
         },
         Grammar.reservedWords + " SELF SUPER MAP"
         ),