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
#!../astl-calc-step1/astl-ulmcalc-free

sub descend(nestlevel, node) {
    var result = "";
    if (isoperator(node)) {
        result = " " x nestlevel & "(\"" & operator(node) & "\"";
        if (len(node) > 0) {
            foreach operand in (node) {
                result = result & "\n" & descend(nestlevel + 3, operand);
            }
            result = result & "\n" & " " x nestlevel & ")";
        } else {
            result = result & ")";
        }
        // result = result & " @" & location(node);
    } else {
        result = " " x nestlevel & tokenliteral(node);
    }
    return result;
}

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);
   }

   println(descend(0, root));
}