#!../astl-calc-step2/astl-ulmcalc-free
/*
   Copyright (C) 2019-2020 Andreas Franz Borchert
                           Michael Christian Lehn
   ----------------------------------------------------------------------------
   Astl-ULMasm is free software; you can redistribute it
   and/or modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either version
   2 of the License, or (at your option) any later version.
   Astl-ULMasm is distributed in the hope that it will be
   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.
   You should have received a copy of the GNU Library General Public
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
library "../lib";
import eval_step2;
import ops;
import printer;
sub join(units) {
   var ops = [];
   while (len(units) > 0) {
      var unit = pop(units);
      foreach op in (unit) {
         push(ops, op);
      }
   }
   return <("compilation_unit" { ops }...)>;
}
sub usage {
   var msg = "Usage: " & cmdname & " [-o outfile] [infile...]";
   println(stderr, msg);
   exit(1);
}
sub main(argv) {
   var unit = root;
   var units = [];
   if (len(argv) == 0) {
      var input = open(stdin);
      var res = parse(stdin);
      if (type(res) == "string") {
         println(stderr, res); exit(1);
      }
      push(units, res);
   } else {
      while (len(argv) > 0) {
         var input_file = pop(argv);
         // parse input file
         var input = open(input_file);
         if (!input) {
            println(stderr, input_file, ": cannot open for reading"); exit(1);
         }
         var res = parse(input);
         if (type(res) == "string") {
            println(stderr, res); exit(1);
         }
         push(units, res);
      }
   }
   if (len(units) == 1) {
      root = units[0];
   } else {
      root = join(units);
   }
   run_attribution_rules(root);
}