#!/bin/sh

op_validator()
{
awk -v verbose=$1 '
	# tree loader
	{
		name=$0
		sub("^ *", "", name)
		level = length($0) - length(name)

		sub($1 " ", "", name)
		sub(" *[[][-+0-9]+:[-+0-9]+.*$", "", name);
		NODE[NR, "type"] = $1
		NODE[NR, "name"] = name
		NODE[LAST[level-1], "children"] = NODE[LAST[level-1], "children"] " " NR
		LAST[level] = NR
	}

	# logics
	END {
		fail = 0;
		ok   = 0;
		for(n = 1; n <= NR; n++) {
			if (NODE[n, "type"] == "OP") {
				num_children = split(NODE[n, "children"], CH, " ");
				if (NODE[n, "name"] ~ "unary$") num_expected  = 1;
				else if (NODE[n, "name"] ~ "binary$") num_expected  = 2;
				else if (NODE[n, "name"] ~ "trenary$") num_expected  = 3;
				else {
					print "Error: operator without unary/binary/trenary suffix in line " n ": " NODE[n, "name"]
					continue
				}
				if (num_children != num_expected) {
					print "Error: number of OP arguments mismatch in line " n ": expected " num_expected ", got " num_children
					fail++
				}
				else
					ok++
			}
		}
		if (verbose) {
			print "passed: " ok  " failed: "  fail "  total: " fail+ok
		}
	}
'
}

verbose=0
while test ! -z "$1"
do
	case $1 in
		-v) verbose=1;;
		*) fn=$1;;
	esac
	shift 1
done


cat $fn | op_validator $verbose
