Blame examples/debflex.awk

Packit f00812
# Clarify the flex debug trace by substituting first line of each rule.
Packit f00812
# Francois Pinard <pinard@iro.umontreal.ca>, July 1990.
Packit f00812
#
Packit f00812
# Rewritten to process correctly \n's in scanner input.
Packit f00812
# BEGIN section modified to correct a collection of rules.
Packit f00812
# Michal Jaegermann <michal@phys.ualberta.ca>, December 1993
Packit f00812
#
Packit f00812
# Sample usage:
Packit f00812
#	flex -d PROGRAM.l
Packit f00812
#	gcc -o PROGRAM PROGRAM.c -lfl
Packit f00812
#	PROGRAM 2>&1 | gawk -f debflex.awk PROGRAM.l
Packit f00812
#
Packit f00812
# (VP's note: this script presently does not work with either "old" or
Packit f00812
#  "new" awk; fixes so it does will be welcome)
Packit f00812
Packit f00812
BEGIN {
Packit f00812
    # Insure proper usage.
Packit f00812
Packit f00812
    if (ARGC != 2) {
Packit f00812
	print "usage: gawk -f debflex.awk FLEX_SOURCE 
Packit f00812
	exit (1);
Packit f00812
    }
Packit f00812
Packit f00812
    # Remove and save the name of flex source.
Packit f00812
Packit f00812
    source = ARGV[1];
Packit f00812
    ARGC--;
Packit f00812
Packit f00812
    # Swallow the flex source file.
Packit f00812
Packit f00812
    line = 0;
Packit f00812
    section = 1;
Packit f00812
    while (getline 
Packit f00812
Packit f00812
	# Count the lines.
Packit f00812
Packit f00812
	line++;
Packit f00812
Packit f00812
	# Count the sections.  When encountering section 3,
Packit f00812
	# break out of the awk BEGIN block.
Packit f00812
Packit f00812
	if (match ($0, /^%%/)) {
Packit f00812
	    section++;
Packit f00812
	    if (section == 3) {
Packit f00812
		break;
Packit f00812
	    }
Packit f00812
	}
Packit f00812
	else {
Packit f00812
	    # Only the lines in section 2 which do not begin in a
Packit f00812
	    # tab or space might be referred to by the flex debug
Packit f00812
	    # trace.  Save only those lines.
Packit f00812
Packit f00812
	    if (section == 2 && match ($0, /^[^ \t]/)) {
Packit f00812
		rules[line] = $0;
Packit f00812
	    }
Packit f00812
	}
Packit f00812
    }
Packit f00812
    dashes = "-----------------------------------------------------------";
Packit f00812
    collect = "";
Packit f00812
    line = 0;
Packit f00812
}
Packit f00812
Packit f00812
# collect complete rule output from a scanner
Packit f00812
$0 !~ /^--/ {
Packit f00812
    collect = collect "\n" $0;
Packit f00812
    next;
Packit f00812
}
Packit f00812
# otherwise we have a new rule - process what we got so far
Packit f00812
{
Packit f00812
    process();
Packit f00812
}
Packit f00812
# and the same thing if we hit EOF
Packit f00812
END {
Packit f00812
    process();
Packit f00812
}
Packit f00812
Packit f00812
function process() {
Packit f00812
Packit f00812
    # splitting this way we loose some double dashes and
Packit f00812
    # left parentheses from echoed input - a small price to pay
Packit f00812
    n = split(collect, field, "\n--|[(]");
Packit f00812
Packit f00812
    # this loop kicks in only when we already collected something
Packit f00812
    for (i = 1; i <= n; i++) {
Packit f00812
	if (0 != line) {
Packit f00812
	    # we do not care for traces of newlines.
Packit f00812
	    if (0 == match(field[i], /\"\n+\"[)]/)) {
Packit f00812
		if (rules[line]) {
Packit f00812
		    text = field[i];
Packit f00812
		    while ( ++i <= n) {
Packit f00812
			text = text field[i];
Packit f00812
		    }
Packit f00812
		    printf("%s:%d: %-8s -- %s\n",
Packit f00812
			   source, line, text, rules[line]);
Packit f00812
		}
Packit f00812
		else {
Packit f00812
		    print;
Packit f00812
		    printf "%s:%d: *** No such rule.\n", source, line;
Packit f00812
		}
Packit f00812
	    }
Packit f00812
	    line = 0;
Packit f00812
	    break;
Packit f00812
	}
Packit f00812
	if ("" != field[i]) {
Packit f00812
	    if ("end of buffer or a NUL)" == field[i]) {
Packit f00812
		print dashes;  # Simplify trace of buffer reloads
Packit f00812
		continue;
Packit f00812
	    }
Packit f00812
	    if (match(field[i], /accepting rule at line /)) {
Packit f00812
		# force interpretation of line as a number
Packit f00812
		line = 0 + substr(field[i], RLENGTH);
Packit f00812
		continue;
Packit f00812
	    }
Packit f00812
	    # echo everything else
Packit f00812
	    printf("--%s\n", field[i]);
Packit f00812
	}
Packit f00812
    }
Packit f00812
    collect = "\n" $0;  # ... and start next trace
Packit f00812
}