]> thyrsus.com Git - mad.git/commitdiff
We can collect line numbers from the yacc parser now.
authorEric S. Raymond <esr@thyrsus,com>
Tue, 20 Jan 2004 19:19:34 +0000 (19:19 +0000)
committerEric S. Raymond <esr@thyrsus,com>
Tue, 20 Jan 2004 19:19:34 +0000 (19:19 +0000)
mad

diff --git a/mad b/mad
index 3374d78820954bbb1a8ee55b28de2b58bbb824e1..23793ba33ef5e5e0623a1297c8d78c0da31a2004 100755 (executable)
--- 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 <math.h>\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
-
-