FoxTextualSymbolFile.Mod 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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,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. IF diagnostics # NIL THEN
  40. diagnostics.Error(module.sourceName, -1, -1, "could not open export file for writing");
  41. END;
  42. result := FALSE;
  43. ELSE
  44. flags := {};
  45. InterfaceComparison.CompareThis(module,SELF,diagnostics,importCache,flags);
  46. IF noRedefinition OR noModification THEN
  47. IF (InterfaceComparison.Redefined IN flags) THEN
  48. diagnostics.Error(module.sourceName,Diagnostics.Invalid,Diagnostics.Invalid," no redefinition of symbol file allowed");
  49. RETURN FALSE;
  50. END;
  51. END;
  52. IF noModification THEN
  53. IF (InterfaceComparison.Extended IN flags) THEN
  54. diagnostics.Error(module.sourceName,Diagnostics.Invalid,Diagnostics.Invalid," no extension of symbol file allowed");
  55. RETURN FALSE;
  56. END;
  57. END;
  58. NEW(writer,file,0);
  59. printer := Printout.NewPrinter(writer, Printout.SymbolFile,FALSE);
  60. printer.Module(module);
  61. writer.Update();
  62. Files.Register(file);
  63. result := TRUE;
  64. END;
  65. RETURN result
  66. END Export;
  67. PROCEDURE DefineOptions(options: Options.Options);
  68. BEGIN
  69. options.Add(0X,"symbolFileExtension",Options.String);
  70. options.Add(0X,"noRedefinition",Options.Flag);
  71. options.Add(0X,"noModification",Options.Flag);
  72. END DefineOptions;
  73. PROCEDURE GetOptions(options: Options.Options);
  74. BEGIN
  75. IF ~options.GetString("symbolFileExtension",extension) THEN extension := ".Sym" END;
  76. noRedefinition := options.GetFlag("noRedefinition");
  77. noModification := options.GetFlag("noModification");
  78. END GetOptions;
  79. END TextualSymbolFile;
  80. PROCEDURE Get*(): Formats.SymbolFileFormat;
  81. VAR symbolFile: TextualSymbolFile;
  82. BEGIN
  83. NEW(symbolFile); RETURN symbolFile
  84. END Get;
  85. END FoxTextualSymbolFile.