FoxTextualSymbolFile.Mod 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. MODULE FoxTextualSymbolFile; (** AUTHOR "fof & fn"; PURPOSE "Oberon Compiler: Symbolfile in- and output"; *)
  2. (* (c) fof ETH Zürich, 2008 *)
  3. IMPORT
  4. D := Debugging, Basic := FoxBasic, Scanner := FoxScanner, SyntaxTree := FoxSyntaxTree, Global := FoxGlobal, Formats := FoxFormats, Files,Streams,
  5. Printout := FoxPrintout,Parser:= FoxParser , SemanticChecker := FoxSemanticChecker, InterfaceComparison := FoxInterfaceComparison, Options, Diagnostics;
  6. CONST Trace = FALSE;
  7. TYPE
  8. TextualSymbolFile = OBJECT (Formats.SymbolFileFormat)
  9. VAR extension: Basic.FileName; noRedefinition, noModification: BOOLEAN;
  10. PROCEDURE Import*(CONST moduleFileName: ARRAY OF CHAR; importCache: SyntaxTree.ModuleScope): SyntaxTree.Module;
  11. VAR fileName: Files.FileName; module: SyntaxTree.Module; reader: Streams.Reader; scanner: Scanner.Scanner; parser: Parser.Parser;
  12. checker: SemanticChecker.Checker;
  13. BEGIN
  14. Basic.Concat(fileName,path,moduleFileName,extension);
  15. IF Trace THEN D.Ln; D.Str("importing "); D.Str(fileName); D.Ln; D.Update; END;
  16. reader := Basic.GetFileReader(fileName);
  17. scanner := Scanner.NewScanner(moduleFileName, reader, 0, diagnostics);
  18. IF ~scanner.error THEN
  19. parser := Parser.NewParser(scanner,NIL, "");
  20. module := parser.Module();
  21. IF parser.error THEN module := NIL END;
  22. END;
  23. IF (module # NIL) & ~(SyntaxTree.Resolved IN module.state) THEN
  24. (*! should rather be done by importer *)
  25. checker := SemanticChecker.NewChecker(NIL,FALSE,TRUE,system,SELF,importCache,"");
  26. checker.Module(module); (* semantic check *)
  27. IF checker.error THEN module := NIL END;
  28. END;
  29. RETURN module
  30. END Import;
  31. PROCEDURE Export*(module: SyntaxTree.Module; importCache: SyntaxTree.ModuleScope): BOOLEAN;
  32. VAR moduleName,fileName: Basic.FileName; writer: Files.Writer; file: Files.File; printer: Printout.Printer; result: BOOLEAN;flags: SET;
  33. BEGIN
  34. Global.ModuleFileName(module.name,module.context,moduleName);
  35. Basic.Concat(fileName,path,moduleName,extension);
  36. IF Trace THEN D.Ln; D.Str("exporting"); D.Str(fileName); D.Ln; D.Update; END;
  37. file := Files.New(fileName);
  38. IF file = NIL THEN
  39. Basic.Error(diagnostics, module.sourceName, Basic.invalidPosition, "could not open export file for writing");
  40. result := FALSE;
  41. ELSE
  42. flags := {};
  43. InterfaceComparison.CompareThis(module,SELF,diagnostics,importCache,flags);
  44. IF noRedefinition OR noModification THEN
  45. IF (InterfaceComparison.Redefined IN flags) THEN
  46. Basic.Error(diagnostics, module.sourceName, Basic.invalidPosition, " no redefinition of symbol file allowed");
  47. RETURN FALSE;
  48. END;
  49. END;
  50. IF noModification THEN
  51. IF (InterfaceComparison.Extended IN flags) THEN
  52. Basic.Error(diagnostics, module.sourceName,Basic.invalidPosition, " no extension of symbol file allowed");
  53. RETURN FALSE;
  54. END;
  55. END;
  56. NEW(writer,file,0);
  57. printer := Printout.NewPrinter(writer, Printout.SymbolFile,FALSE);
  58. printer.Module(module);
  59. writer.Update();
  60. Files.Register(file);
  61. result := TRUE;
  62. END;
  63. RETURN result
  64. END Export;
  65. PROCEDURE DefineOptions*(options: Options.Options);
  66. BEGIN
  67. options.Add(0X,"symbolFileExtension",Options.String);
  68. options.Add(0X,"noRedefinition",Options.Flag);
  69. options.Add(0X,"noModification",Options.Flag);
  70. END DefineOptions;
  71. PROCEDURE GetOptions*(options: Options.Options);
  72. BEGIN
  73. IF ~options.GetString("symbolFileExtension",extension) THEN extension := ".Sym" END;
  74. noRedefinition := options.GetFlag("noRedefinition");
  75. noModification := options.GetFlag("noModification");
  76. END GetOptions;
  77. END TextualSymbolFile;
  78. PROCEDURE Get*(): Formats.SymbolFileFormat;
  79. VAR symbolFile: TextualSymbolFile;
  80. BEGIN
  81. NEW(symbolFile); RETURN symbolFile
  82. END Get;
  83. END FoxTextualSymbolFile.