Browse Source

Автодок: IMPORT, не закончено

Arthur Yefimov 2 years ago
parent
commit
02576dc28b
1 changed files with 41 additions and 9 deletions
  1. 41 9
      src/Autodoc/AutodocParser.Mod

+ 41 - 9
src/Autodoc/AutodocParser.Mod

@@ -88,6 +88,9 @@ TYPE
   GroupDesc* = RECORD(ListDesc)
   GroupDesc* = RECORD(ListDesc)
     ordinalConsts*: BOOLEAN
     ordinalConsts*: BOOLEAN
   END;
   END;
+  
+  Import* = POINTER TO ImportDesc;
+  ImportDesc* = RECORD(ObjectDesc) END;
 
 
   Const* = POINTER TO ConstDesc;
   Const* = POINTER TO ConstDesc;
   ConstDesc* = RECORD(ObjectDesc)
   ConstDesc* = RECORD(ObjectDesc)
@@ -125,10 +128,9 @@ TYPE
   ModuleDesc* = RECORD(ObjectDesc)
   ModuleDesc* = RECORD(ObjectDesc)
     foreign*: BOOLEAN; (** TRUE if module has a [foreign] mark *)
     foreign*: BOOLEAN; (** TRUE if module has a [foreign] mark *)
     exportedOnly*: BOOLEAN; (** TRUE if only exported objects are included *)
     exportedOnly*: BOOLEAN; (** TRUE if only exported objects are included *)
-    consts*: List;
-    types*: List;
-    vars*: List;
-    procedures*: List
+    imports*: List; (** List of imports (no groups) *)
+    consts*, types*, vars*: List; (** List of groups *)
+    procedures*: List (** List of groups *)
   END;
   END;
 
 
 VAR
 VAR
@@ -803,6 +805,11 @@ BEGIN
   END
   END
 END CheckDirective;
 END CheckDirective;
 
 
+(** Registers the given module name as imported module in global variable M. *)
+PROCEDURE AddImportedModule(name: ARRAY OF CHAR);
+BEGIN
+END AddImportedModule;
+
 (** Type **)
 (** Type **)
 
 
 PROCEDURE NewType(form: INTEGER): Type;
 PROCEDURE NewType(form: INTEGER): Type;
@@ -817,6 +824,13 @@ VAR par: Param;
 BEGIN NEW(par); InitObject(par); par.passed := passed; Strings.Copy(id, par.name)
 BEGIN NEW(par); InitObject(par); par.passed := passed; Strings.Copy(id, par.name)
 RETURN par END NewParam;
 RETURN par END NewParam;
 
 
+(** Import **)
+
+PROCEDURE NewImport(): Import;
+VAR I: Import;
+BEGIN NEW(I); InitObject(I); Strings.Copy(id, I.name)
+RETURN I END NewImport;
+
 (** Const **)
 (** Const **)
 
 
 PROCEDURE NewConst(): Const;
 PROCEDURE NewConst(): Const;
@@ -1008,8 +1022,10 @@ BEGIN
     T := NewType(namedType);
     T := NewType(namedType);
     Strings.Copy(id, T.name);
     Strings.Copy(id, T.name);
     GetSym;
     GetSym;
-    IF sym = period THEN GetSym; Strings.Append('.', T.name);
-      IF sym = ident THEN Strings.Append(id, T.name); GetSym
+    IF sym = period THEN GetSym;
+      IF sym = ident THEN
+        AddImportedModule(T.name);
+        Strings.Append('.', T.name); Strings.Append(id, T.name); GetSym
       ELSE MarkExp('identifier')
       ELSE MarkExp('identifier')
       END
       END
     END
     END
@@ -1188,11 +1204,27 @@ BEGIN
 END Declarations;
 END Declarations;
 
 
 PROCEDURE ParseImport(M: Module);
 PROCEDURE ParseImport(M: Module);
+VAR I: Import;
 BEGIN
 BEGIN
-  REPEAT GetSym UNTIL (sym = eot) OR (sym = procedure) OR (sym = begin) OR
-    (sym = end) OR (sym = const) OR (sym = type) OR (sym = var)
+  IF sym = ident THEN
+    I := NewImport(); GetSym;
+    IF sym = becomes THEN GetSym;
+      Strings.Copy(I.name, I.alias);
+      Strings.Copy(id, I.name);
+      GetSym
+    END
+  END (*!TODO*)
 END ParseImport;
 END ParseImport;
 
 
+PROCEDURE ParseImportList(M: Module);
+BEGIN
+  IF sym = import THEN
+    GetSym; ParseImport(M);
+    WHILE sym = comma DO GetSym; ParseImport(M) END
+    IF sym = semicol THEN GetSym ELSE MarkExp(';') END
+  END
+END ParseImportList;
+
 PROCEDURE FindMin(G: Group; ordinal: BOOLEAN): Object;
 PROCEDURE FindMin(G: Group; ordinal: BOOLEAN): Object;
 VAR x: Object;
 VAR x: Object;
 BEGIN
 BEGIN
@@ -1274,7 +1306,7 @@ BEGIN NEW(M); InitObject(M); M.foreign := FALSE;
     ELSE MarkExp('module name')
     ELSE MarkExp('module name')
     END;
     END;
     IF sym = semicol THEN GetSym ELSE MarkExp(';') END;
     IF sym = semicol THEN GetSym ELSE MarkExp(';') END;
-    IF sym = import THEN ParseImport(M) END;
+    ParseImportList(M);
     SaveAllComments(M);
     SaveAllComments(M);
     Debug('Begin Declarations');
     Debug('Begin Declarations');
     Declarations(M);
     Declarations(M);