#!/usr/bin/env python
-reserved = ('DIMENSION',)
+reserved = ('DIMENSION', 'FOR', 'OF', 'THROUGH', 'VALUES')
tokens = reserved + (
- 'TAB', 'NEWLINE',
+ 'TAB', 'SEMI',
'COMMA',
'NAME','INTEGER', 'FLOAT',
'LPAREN','RPAREN',
# Tokens
+t_SEMI = r';'
t_TAB = r'\t'
-t_NEWLINE = r'\n'
t_COMMA = r'\,'
t_ABS = r'\.ABS\.'
t_EXP = r'\.P\.'
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]`
| 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
'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'
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