From: Eric S. Raymond Date: Tue, 20 Jan 2004 19:19:34 +0000 (+0000) Subject: We can collect line numbers from the yacc parser now. X-Git-Tag: 1.0~183 X-Git-Url: http://thyrsus.com/gitweb/?a=commitdiff_plain;h=dc2fa92ca88c5e652e6fd698785aa1031591324a;p=mad.git We can collect line numbers from the yacc parser now. --- diff --git a/mad b/mad index 3374d78..23793ba 100755 --- a/mad +++ b/mad @@ -84,6 +84,8 @@ precedence = ( ('right', 'ABS', 'UPLUS') ) +sourcefile = "" +sourceline = 0 deck = [] scopes = [] targets = [] @@ -97,11 +99,11 @@ def p_program(t): def p_card(t): 'card : TAB statement SEMI' - deck.append((None, t[2])) + deck.append((t.lineno(1), None, t[2])) def p_labeled_card(t): 'card : NAME TAB statement SEMI' - deck.append((t[1], t[3])) + deck.append((t.lineno(1), t[1], t[3])) # Statement level @@ -306,7 +308,7 @@ def analyze(deck): "Gather variable types." global integers, floats, bools # Mine the code for compile-time directives - for (label, statement) in deck: + for (line, label, statement) in deck: if statement[0] == 'integer': for var in statement[1:]: declare(var, integers) @@ -394,7 +396,7 @@ def fmt_convert(str, write=True): while str[i] != ',': i += 1 if i <= 0: - sys.stderr.write('invalid spacer in %s\n' % str) + sys.stderr.write('"%s", line %d: invalid spacer in %s\n' % (sourcefile, sourceline, str)) sys.exit(1) count = int(str[1:i]) if write: @@ -426,7 +428,7 @@ def fmt_convert(str, write=True): res += ('%' + str[1:i] + 'd') * count str = str[i:] else: - sys.stderr.write('invalid field code in format string %s!\n' % str) + sys.stderr.write('"%s", line %d: invalid field code in format string %s!\n' % (sourcefile, sourceline, str)) sys.exit(1) # Clip off format character if write: @@ -456,7 +458,7 @@ def print_statement(statement): def generate(out): out.write('#include \n\n') - for (label, statement) in deck: + for (line, label, statement) in deck: if statement == 'function': # FIXME: someday, deduce when return is of integral type out.write('float %s {return %s;}' \ @@ -475,7 +477,8 @@ def generate(out): for (id, value) in static.items(): out.write('\tstatic const char *%s\t= "%s";\n' % (id, fmt_convert(value))) indent = 0 - for (label, statement) in deck: + global sourceline + for (sourceline, label, statement) in deck: if label in targets: sys.stdout.write(label+':') rep = print_statement(statement) @@ -530,5 +533,3 @@ if __name__ == '__main__': sys.exit(1) # end - -