From a4ea19cd7279aedb285d1859d014cffed3011450 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Wed, 14 Jan 2004 08:56:39 +0000 Subject: [PATCH] We handle DIMENSION now. --- mad | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/mad b/mad index 7c6d8f8..6b0eecd 100755 --- 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 -- 2.43.0