compile.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. "use strict";
  2. var oc = require("oc");
  3. var fs = require("fs");
  4. var rtl = require("rtl.js");
  5. var Stream = require("stream.js").Stream;
  6. var Class = rtl.Class;
  7. var Compiler = Class.extend({
  8. init: function Compiler(){
  9. this.__rtl = new rtl.RTL();
  10. this.__code = "";
  11. this.__errors = "";
  12. this.__modules = {};
  13. },
  14. addFile: function(file){
  15. console.info("compiling '" + file + "...")
  16. var text = fs.readFileSync(file, "utf8");
  17. var stream = new Stream(text);
  18. var module = oc.compileModule(
  19. stream,
  20. this.__rtl,
  21. this.__resolveModule.bind(this),
  22. function(e){this.__handleErrors(file, e);}.bind(this)
  23. );
  24. if (!module)
  25. return undefined;
  26. this.__code += module.code();
  27. var symbol = module.symbol();
  28. this.__modules[symbol.id()] = symbol.info();
  29. return symbol.info();
  30. },
  31. code: function(){return this.__rtl.generate() + this.__code;},
  32. errors: function(){return this.__errors;},
  33. __resolveModule: function(name){
  34. var compiled = this.__modules[name];
  35. if (compiled)
  36. return compiled;
  37. var fileName = name + ".ob";
  38. return this.addFile(fileName);
  39. },
  40. __handleErrors: function(file, e){
  41. this.__errors += "File \"" + file + "\", " + e;
  42. }
  43. });
  44. function compile(src){
  45. var compiler = new Compiler();
  46. compiler.addFile(src);
  47. var errors = compiler.errors();
  48. if (errors){
  49. console.info(errors);
  50. return;
  51. }
  52. var fileName = "a.js";
  53. fs.writeFileSync(fileName, compiler.code());
  54. console.info("compiled to '" + fileName + "' - OK!");
  55. }
  56. function main(){
  57. if (process.argv.length < 2){
  58. console.info("compile.js <oberon source file path>");
  59. return;
  60. }
  61. compile(process.argv[2]);
  62. }
  63. main();