#!../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));
}