]> thyrsus.com Git - mad.git/commitdiff
We handle DIMENSION now.
authorEric S. Raymond <esr@thyrsus,com>
Wed, 14 Jan 2004 08:56:39 +0000 (08:56 +0000)
committerEric S. Raymond <esr@thyrsus,com>
Wed, 14 Jan 2004 08:56:39 +0000 (08:56 +0000)
mad

diff --git a/mad b/mad
index 7c6d8f843b553b6217500908d5dc5f1bb2742431..6b0eecd61cc4ab29885263dec5a1317b379bcaac 100755 (executable)
--- a/mad
+++ b/mad
@@ -1,9 +1,9 @@
 #!/usr/bin/env python
 
-reserved = ('DIMENSION',)
+reserved = ('DIMENSION', 'FOR', 'OF', 'THROUGH', 'VALUES')
 
 tokens = reserved + (
-    'TAB', 'NEWLINE',
+    'TAB', 'SEMI',
     'COMMA',
     'NAME','INTEGER', 'FLOAT',
     'LPAREN','RPAREN',
@@ -15,8 +15,8 @@ tokens = reserved + (
 
 # Tokens
 
+t_SEMI    = r';'
 t_TAB     = r'\t'
-t_NEWLINE = r'\n'
 t_COMMA   = r'\,'
 t_ABS     = r'\.ABS\.'
 t_EXP     = r'\.P\.'
@@ -50,7 +50,7 @@ def t_NAME(t):
     t.type = reserved_map.get(t.value, "NAME")
     return t
 
-t_ignore = " "
+t_ignore = " \n"
 
 def t_error(t):
     print "Illegal character %s" % `t.value[0]`
@@ -85,11 +85,11 @@ def p_program(t):
                | program card'''
 
 def p_card(t):
-    'card : TAB statement NEWLINE' 
+    'card : TAB statement SEMI' 
     cards.append((None, t[2]))
 
 def p_labeled_card(t):
-    'card : NAME TAB statement NEWLINE'
+    'card : NAME TAB statement SEMI'
     cards.append((t[1], t[3]))
 
 # Statement level
@@ -105,6 +105,20 @@ def p_dimension_list_continue(t):
     'dimension_list : dimension_list COMMA NAME application'
     t[0] = t[1] + [[t[3], tuple(t[4])]]
 
+## THROUGH
+def p_through_for(t):
+    'statement : THROUGH NAME COMMA FOR NAME EQUALS expression COMMA expression COMMA expression'
+    t[0] = ('for', t[2], t[7], t[9], t[11])
+def p_through_map(t):
+    'statement : THROUGH NAME COMMA FOR VALUES OF NAME EQUALS value_list'
+    t[0] = ('map', t[2], t[7], t[9])
+def p_map(t):
+    'value_list : expression'
+    t[0] = [t[1]]
+def p_map_continue(t):
+    'value_list : value_list COMMA expression'
+    t[0] = t[1] + [t[3]]
+
 ## Assignment
 def p_statement_substitution(t):
     'statement : NAME EQUALS expression'
@@ -190,7 +204,10 @@ def p_error(t):
 import yacc
 yacc.yacc()
 
-import sys
+import sys, re
 
-yacc.parse(sys.stdin.read(), debug=2)
+source = sys.stdin.read()
+# Grotty hack to add end-of-statement delimiters
+source = re.sub("\n([A-Z]|\t)", " ;\n\\1", source).rstrip() + " ;\n"
+yacc.parse(source, debug=2)
 print cards