1 # Clarify the flex debug trace by substituting first line of each rule. 2 # Francois Pinard <pinard (at] iro.umontreal.ca>, July 1990. 3 # 4 # Rewritten to process correctly \n's in scanner input. 5 # BEGIN section modified to correct a collection of rules. 6 # Michal Jaegermann <michal (at] phys.ualberta.ca>, December 1993 7 # 8 # Sample usage: 9 # flex -d PROGRAM.l 10 # gcc -o PROGRAM PROGRAM.c -lfl 11 # PROGRAM 2>&1 | gawk -f debflex.awk PROGRAM.l 12 # 13 # (VP's note: this script presently does not work with either "old" or 14 # "new" awk; fixes so it does will be welcome) 15 16 BEGIN { 17 # Insure proper usage. 18 19 if (ARGC != 2) { 20 print "usage: gawk -f debflex.awk FLEX_SOURCE <DEBUG_OUTPUT"; 21 exit (1); 22 } 23 24 # Remove and save the name of flex source. 25 26 source = ARGV[1]; 27 ARGC--; 28 29 # Swallow the flex source file. 30 31 line = 0; 32 section = 1; 33 while (getline <source) { 34 35 # Count the lines. 36 37 line++; 38 39 # Count the sections. When encountering section 3, 40 # break out of the awk BEGIN block. 41 42 if (match ($0, /^%%/)) { 43 section++; 44 if (section == 3) { 45 break; 46 } 47 } 48 else { 49 # Only the lines in section 2 which do not begin in a 50 # tab or space might be referred to by the flex debug 51 # trace. Save only those lines. 52 53 if (section == 2 && match ($0, /^[^ \t]/)) { 54 rules[line] = $0; 55 } 56 } 57 } 58 dashes = "-----------------------------------------------------------"; 59 collect = ""; 60 line = 0; 61 } 62 63 # collect complete rule output from a scanner 64 $0 !~ /^--/ { 65 collect = collect "\n" $0; 66 next; 67 } 68 # otherwise we have a new rule - process what we got so far 69 { 70 process(); 71 } 72 # and the same thing if we hit EOF 73 END { 74 process(); 75 } 76 77 function process() { 78 79 # splitting this way we loose some double dashes and 80 # left parentheses from echoed input - a small price to pay 81 n = split(collect, field, "\n--|[(]"); 82 83 # this loop kicks in only when we already collected something 84 for (i = 1; i <= n; i++) { 85 if (0 != line) { 86 # we do not care for traces of newlines. 87 if (0 == match(field[i], /\"\n+\"[)]/)) { 88 if (rules[line]) { 89 text = field[i]; 90 while ( ++i <= n) { 91 text = text field[i]; 92 } 93 printf("%s:%d: %-8s -- %s\n", 94 source, line, text, rules[line]); 95 } 96 else { 97 print; 98 printf "%s:%d: *** No such rule.\n", source, line; 99 } 100 } 101 line = 0; 102 break; 103 } 104 if ("" != field[i]) { 105 if ("end of buffer or a NUL)" == field[i]) { 106 print dashes; # Simplify trace of buffer reloads 107 continue; 108 } 109 if (match(field[i], /accepting rule at line /)) { 110 # force interpretation of line as a number 111 line = 0 + substr(field[i], RLENGTH); 112 continue; 113 } 114 # echo everything else 115 printf("--%s\n", field[i]); 116 } 117 } 118 collect = "\n" $0; # ... and start next trace 119 } 120