]> thyrsus.com Git - mad.git/commitdiff
Fix the calculator to return parse trees.
authorEric S. Raymond <esr@thyrsus,com>
Wed, 14 Jan 2004 03:39:20 +0000 (03:39 +0000)
committerEric S. Raymond <esr@thyrsus,com>
Wed, 14 Jan 2004 03:39:20 +0000 (03:39 +0000)
mad

diff --git a/mad b/mad
index efa391e2e67f2ce83bf2a713593d1263f045f115..d892624ce74cda95aa7311ab42925abbf8cf664b 100755 (executable)
--- a/mad
+++ b/mad
@@ -54,30 +54,25 @@ precedence = (
     ('right','UMINUS'),
     )
 
-# dictionary of names
-names = { }
-
 def p_statement_assign(t):
     'statement : NAME EQUALS expression'
-    names[t[1]] = t[3]
+    t[0] = ('substitution', t[1], t[3])
 
 def p_statement_expr(t):
     'statement : expression'
-    print t[1]
+    t[0] = t[1]
+    print t[0]
 
 def p_expression_binop(t):
     '''expression : expression PLUS expression
                   | expression MINUS expression
                   | expression TIMES expression
                   | expression DIVIDE expression'''
-    if t[2] == '+'  : t[0] = t[1] + t[3]
-    elif t[2] == '-': t[0] = t[1] - t[3]
-    elif t[2] == '*': t[0] = t[1] * t[3]
-    elif t[2] == '/': t[0] = t[1] / t[3]
+    t[0] = (t[2], t[1], t[3])
 
 def p_expression_uminus(t):
     'expression : MINUS expression %prec UMINUS'
-    t[0] = -t[2]
+    t[0] = ('-', t[2])
 
 def p_expression_group(t):
     'expression : LPAREN expression RPAREN'
@@ -89,11 +84,7 @@ def p_expression_number(t):
 
 def p_expression_name(t):
     'expression : NAME'
-    try:
-        t[0] = names[t[1]]
-    except LookupError:
-        print "Undefined name '%s'" % t[1]
-        t[0] = 0
+    t[0] = t[1]
 
 def p_error(t):
     print "Syntax error at '%s'" % t.value