From a05310d4b1c0152b7aeb8083ee9a3ef7c92ea2f1 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 15 Jan 2004 01:13:48 +0000 Subject: [PATCH] Code generation mostly functional. --- mad | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/mad b/mad index b718543..805448c 100755 --- 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: -- 2.43.0