FoxFrontend.Mod 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. MODULE FoxFrontend; (** AUTHOR "fof"; PURPOSE "Oberon Compiler: Common frontend module"; **)
  2. IMPORT
  3. Streams, Diagnostics, SyntaxTree := FoxSyntaxTree, Strings;
  4. TYPE
  5. Frontend* = OBJECT
  6. VAR
  7. lineNumbers*: BOOLEAN;
  8. PROCEDURE & InitFrontEnd*;
  9. BEGIN
  10. Initialize(NIL, NIL, "", 0);
  11. END InitFrontEnd;
  12. (* initialize frontend for usage *)
  13. PROCEDURE Initialize*(diagnostics: Diagnostics.Diagnostics; reader: Streams.Reader;CONST fileName: ARRAY OF CHAR; pos: LONGINT);
  14. BEGIN
  15. END Initialize;
  16. PROCEDURE Parse*(): SyntaxTree.Module;
  17. BEGIN RETURN NIL
  18. END Parse;
  19. PROCEDURE Done*(): BOOLEAN;
  20. BEGIN RETURN TRUE;
  21. END Done;
  22. PROCEDURE Error*(): BOOLEAN;
  23. BEGIN RETURN TRUE;
  24. END Error;
  25. END Frontend;
  26. PROCEDURE GetDummy*():Frontend;
  27. VAR frontend: Frontend;
  28. BEGIN
  29. NEW(frontend);
  30. RETURN frontend;
  31. END GetDummy;
  32. PROCEDURE GetFrontendByName*(CONST name: ARRAY OF CHAR): Frontend;
  33. VAR
  34. procname: ARRAY 256 OF CHAR;
  35. factory: PROCEDURE (): Frontend;
  36. frontend: Frontend;
  37. BEGIN
  38. frontend := NIL;
  39. IF Strings.Length(name) > 0 THEN
  40. GETPROCEDURE(name,"Get", factory); (* try long name for example -G=OCERAFrontend *)
  41. IF factory = NIL THEN (* try short name for example -G=ERA*)
  42. procname := "Fox";
  43. Strings.Append(procname, name);
  44. Strings.Append(procname, "Frontend");
  45. GETPROCEDURE(procname,"Get", factory);
  46. END;
  47. IF factory # NIL THEN
  48. frontend := factory();
  49. Assert(frontend # NIL,"frontend factory returned NIL frontend");
  50. END;
  51. END;
  52. RETURN frontend
  53. END GetFrontendByName;
  54. PROCEDURE Assert(b: BOOLEAN; CONST reason: ARRAY OF CHAR);
  55. BEGIN
  56. ASSERT(b);
  57. END Assert;
  58. END FoxFrontend.