]> thyrsus.com Git - mad.git/commitdiff
Code generation mostly functional.
authorEric S. Raymond <esr@thyrsus,com>
Thu, 15 Jan 2004 01:13:48 +0000 (01:13 +0000)
committerEric S. Raymond <esr@thyrsus,com>
Thu, 15 Jan 2004 01:13:48 +0000 (01:13 +0000)
mad

diff --git a/mad b/mad
index b718543dcad3d500c2a2ed32ef88aa8a4897edf9..805448cb591fb9f1312d5eac81574db47ded6ab4 100755 (executable)
--- a/mad
+++ b/mad
@@ -7,7 +7,7 @@ reserved = ('CONDITIONAL', 'DIMENSION', 'END', 'FOR', 'FORMAT',
 tokens = reserved + (
     'TAB', 'SEMI',
     'COMMA',
-    'NAME','INTNUM', 'FLOATNUM', 'FUNCALL',
+    'NAME','INTNUM', 'FLOATNUM', 'STRING', 'FUNCALL',
     'LPAREN','RPAREN',
     'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
     'NOT', 'OR', 'AND', 'THEN', 'EQV',
@@ -42,6 +42,7 @@ t_LPAREN  = r'\('
 t_RPAREN  = r'\)'
 t_FLOATNUM= r'\d+\.\d*'
 t_INTNUM  = r'\d+'
+t_STRING  = r'\$[^$]*\$'
 
 reserved_map = { }
 for r in reserved:
@@ -165,6 +166,7 @@ def p_map_continue(t):
 def p_transfer(t):
     "statement : TRANSFER TO NAME"
     t[0] = ('goto', t[3])
+    print "Foo!", t[3]
     targets.append(t[3])
 
 ## WHENEVER
@@ -175,10 +177,10 @@ def p_whenever_complex(t):
     'statement : WHENEVER expression'
     t[0] = ('whenever', t[2], t[4])
 
-## VECTOR VALUES
-#def p_vector_values(t):
-#    "statement : VECTOR VALUES assignlist"
-#    t[0] = ('values',) + tuple(t[3])
+# VECTOR VALUES
+def p_vector_values(t):
+    "statement : VECTOR VALUES NAME EQUALS STRING"
+    t[0] = ('values',) + (t[3], t[5])
 
 ## Assignment
 def p_statement_substitution(t):
@@ -278,6 +280,9 @@ floats = []
 bools = []
 dimensions = {}
 
+# Map MAD intrinsics to C library functions
+madfunc_map = {'elog':'log'}
+
 def declare(var, lst):
     if var in untyped:
         untyped.remove(var)
@@ -307,7 +312,8 @@ def print_expr(t):
                 res += "[" + dim[1] + "]"
         return res
     elif t[0] == 'apply':
-        return t[1][:-1] + `t[2]`
+        madfunc = t[1][:-1]
+        return madfunc_map.get(madfunc, madfunc) + "(" + " ,".join(map(print_expr, t[2])) + ")"
     elif t[0] == '+':
         if len(t) == 2:
             return "%s" % print_expr(t[1])
@@ -361,6 +367,10 @@ def print_statement(statement):
         return "goto " + statement[1] + ";" 
     elif statement[0] == 'if':
         return "if (" + print_expr(statement[1]) + ") " + print_statement(statement[2])
+    elif statement[0] == 'read':
+        return 'scanf(' + statement[1] + ', ' + ", ".join(map(lambda x: "&"+x, statement[2:])) + ");"
+    elif statement[0] == 'print':
+        return 'printf(' + statement[1] + ', ' + ", ".join(statement[2:]) + ");"
     elif statement[0] == 'substitution':
         return statement[1] + " = " + print_expr(statement[2]) + ";"
     else: