1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!../astl-calc-step3/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_step3;
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);
}