Parcourir la source

js -> eberon transition

Vladislav Folts il y a 10 ans
Parent
commit
5b2663b130

BIN
bin/compiled.zip


+ 0 - 84
src/context.js

@@ -1,94 +1,10 @@
 "use strict";
 
-var Cast = require("js/Cast.js");
-var Code = require("js/Code.js");
-var CodeGenerator = require("js/CodeGenerator.js");
-var ConstValue = require("js/ConstValue.js");
-var ContextExpression = require("js/ContextExpression.js");
-var ContextIf = require("js/ContextIf.js");
 var ContextHierarchy = require("js/ContextHierarchy.js");
-var ContextProcedure = require("js/ContextProcedure.js");
-var ContextType = require("js/ContextType.js");
-var Designator = require("js/Designator.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 ObContext = require("js/Context.js");
-var Parser = require("parser.js");
-var Procedure = require("js/Procedure.js");
-var Record = require("js/Record.js");
 var Class = require("rtl.js").Class;
-var Scope = require("js/Scope.js");
-var Symbol = require("js/Symbols.js");
-var Type = require("js/Types.js");
-var TypeId = require("js/TypeId.js");
-var Variable = require("js/Variable.js");
-
-var basicTypes = Type.basic();
-var nullCodeGenerator = CodeGenerator.nullGenerator();
-var nilType = Type.nil();
-/*
-function log(s){
-    console.info(s);
-}
-*/
 
 var ChainedContext = ContextHierarchy.Node;
 ChainedContext.extend = Class.extend;
 ChainedContext.prototype.init = ContextHierarchy.Node;
 
-var ModuleImport = ChainedContext.extend({
-    init: function ModuleImport(context){
-        ChainedContext.prototype.init.call(this, context);
-        this.__import = {};
-        this.__currentModule = undefined;
-        this.__currentAlias = undefined;
-    },
-    handleIdent: function(id){
-        this.__currentModule = id;
-    },
-    handleLiteral: function(s){
-        if (s == ":=")
-            this.__currentAlias = this.__currentModule;
-        else if (s == ",")
-            this.__handleImport();
-    },
-    endParse: function(){
-        if (this.__currentModule)
-            this.__handleImport();
-
-        var modules = [];
-        var unresolved = [];
-        for(var alias in this.__import){
-            var moduleName = this.__import[alias];
-            var module = this.parent().findModule(moduleName);
-            if (!module)
-                unresolved.push(moduleName);
-            else
-                modules.push(new Symbol.Symbol(alias, module));
-        }
-        if (unresolved.length)
-            throw new Errors.Error("module(s) not found: " + unresolved.join(", "));
-        
-        this.parent().handleImport(modules);
-    },
-    __handleImport: function(){
-        var alias = this.__currentAlias;
-        if (!alias)
-            alias = this.__currentModule;
-        else
-            this.__currentAlias = undefined;
-        
-        for(var a in this.__import){
-            if (a == alias)
-                throw new Errors.Error("duplicated alias: '" + alias +"'");
-            if (this.__import[a] == this.__currentModule)
-                throw new Errors.Error("module already imported: '" + this.__currentModule +"'");
-        }
-        this.__import[alias] = this.__currentModule;
-    }
-});
-exports.ModuleImport = ModuleImport;
-
 exports.Chained = ChainedContext;

+ 0 - 1
src/eberon/eberon_grammar.js

@@ -1,7 +1,6 @@
 "use strict";
 
 var Cast = require("js/EberonCast.js");
-var Context = require("context.js");
 var EbArray = require("js/EberonArray.js");
 var CodeGenerator = require("js/CodeGenerator.js");
 var ContextType = require("js/ContextType.js");

+ 2 - 3
src/grammar.js

@@ -1,17 +1,16 @@
 "use strict";
 
-var Context = require("context.js");
 var ContextAssignment = require("js/ContextAssignment.js");
 var ContextCase = require("js/ContextCase.js");
 var ContextDesignator = require("js/ContextDesignator.js");
 var ContextExpression = require("js/ContextExpression.js");
 var ContextIdentdef = require("js/ContextIdentdef.js");
 var ContextLoop = require("js/ContextLoop.js");
+var ContextModule = require("js/ContextModule.js");
 var ContextProcedure = require("js/ContextProcedure.js");
 var ContextType = require("js/ContextType.js");
 var Lexer = require("js/Lexer.js");
 var Parser = require("parser.js");
-var Class = require("rtl.js").Class;
 
 var literal = Parser.literal;
 var point = Lexer.point;
@@ -225,7 +224,7 @@ result.procedureBody
           required("END", "END expected (PROCEDURE)"));
 result.module
     = context(and("MODULE", ident, ";",
-                  context(optional(and(importList, ";")), Context.ModuleImport),
+                  context(optional(and(importList, ";")), ContextModule.Import),
                   result.declarationSequence,
                   optional(and("BEGIN", statementSequence)),
                   required("END", "END expected (MODULE)"), ident, point),

+ 67 - 2
src/ob/ContextModule.ob

@@ -1,7 +1,7 @@
 MODULE ContextModule;
 IMPORT
-    ContextHierarchy, Errors, LanguageContext, Scope, ScopeBase, Symbols,
-    Types;
+    ContextHierarchy, Errors, LanguageContext, 
+    Scope, ScopeBase, String, Symbols, Types;
 TYPE
     Declaration* = RECORD(ContextHierarchy.Node)
         PROCEDURE findModule(name: STRING): Types.PModule;
@@ -12,6 +12,12 @@ TYPE
         moduleScope: Scope.PModule;
         moduleGen: LanguageContext.PModuleGenerator;
     END;
+    PDeclaration = POINTER TO Declaration;
+
+    Import* = RECORD(ContextHierarchy.Node)
+        currentModule, currentAlias: STRING;
+        import: MAP OF STRING;
+    END;
 
 PROCEDURE Declaration.handleIdent(id: STRING);
 BEGIN
@@ -77,4 +83,63 @@ BEGIN
     RETURN result;
 END;
 
+PROCEDURE Import.handleIdent(id: STRING);
+BEGIN
+    SELF.currentModule := id;
+END;
+
+PROCEDURE handleImport(VAR import: Import);
+BEGIN
+    alias <- import.currentAlias;
+    IF LEN(alias) = 0 THEN
+        alias := import.currentModule;
+    ELSE
+        import.currentAlias := "";
+    END;
+    
+    FOR a, m IN import.import DO
+        IF a = alias THEN
+            Errors.raise("duplicated alias: '" + alias +"'");
+        ELSIF m = import.currentModule THEN
+            Errors.raise("module already imported: '" + import.currentModule + "'");
+        END;
+    END;
+    import.import[alias] := import.currentModule;
+END;
+
+PROCEDURE Import.handleLiteral(s: STRING);
+BEGIN
+    IF s = ":=" THEN
+        SELF.currentAlias := SELF.currentModule;
+    ELSIF s = "," THEN
+        handleImport(SELF);
+    END;
+END;
+
+PROCEDURE Import.endParse(): BOOLEAN;
+VAR
+    modules: ARRAY * OF Symbols.PSymbol;
+    unresolved: ARRAY * OF STRING;
+BEGIN
+    IF LEN(SELF.currentModule) # 0 THEN
+        handleImport(SELF);
+    END;
+
+    parent <- SELF.parent()(PDeclaration);
+    FOR alias, moduleName IN SELF.import DO
+        module <- parent.findModule(moduleName);
+        IF module = NIL THEN
+            unresolved.add(moduleName);
+        ELSE
+            modules.add(NEW Symbols.Symbol(alias, module));
+        END;
+    END;
+    IF LEN(unresolved) # 0 THEN
+        Errors.raise("module(s) not found: " + String.join(unresolved, ", "));
+    END;
+    
+    parent.handleImport(modules);
+    RETURN TRUE;
+END;
+
 END ContextModule.

+ 0 - 1
src/oberon/oberon_grammar.js

@@ -2,7 +2,6 @@
 
 var Cast = require("js/Cast.js");
 var CodeGenerator = require("js/CodeGenerator.js");
-var Context = require("context.js");
 var ContextCase = require("js/ContextCase.js");
 var ContextConst = require("js/ContextConst.js");
 var ContextDesignator = require("js/ContextDesignator.js");

+ 0 - 1
test/test_unit.js

@@ -3,7 +3,6 @@
 var assert = require("rtl.js").assert;
 var Class = require("rtl.js").Class;
 var CodeGenerator = require("js/CodeGenerator.js");
-var Context = require("context.js");
 var Grammar = require("grammar.js");
 var Test = require("test.js");
 var TestUnitCommon = require("test_unit_common.js");