#!/usr/bin/env python
-tokens = (
- 'TAB',
+reserved = ('DIMENSION',)
+
+tokens = reserved + (
+ 'TAB', 'NEWLINE',
'COMMA',
'NAME','INTEGER', 'FLOAT',
'LPAREN','RPAREN',
# Tokens
t_TAB = r'\t'
+t_NEWLINE = r'\n'
t_COMMA = r'\,'
t_ABS = r'\.ABS\.'
t_EXP = r'\.P\.'
t_EQUALS = r'='
t_LPAREN = r'\('
t_RPAREN = r'\)'
-t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
t_FLOAT = r'\d+\.\d*'
t_INTEGER = r'\d+'
+reserved_map = { }
+for r in reserved:
+ reserved_map[r] = r
+
+def t_NAME(t):
+ r'[a-zA-Z_][a-zA-Z0-9_]*'
+ t.type = reserved_map.get(t.value, "NAME")
+ return t
+
t_ignore = " "
-def t_newline(t):
- r'\n+'
- t.lineno += t.value.count("\n")
-
def t_error(t):
- print "Illegal character '%s'" % t.value[0]
+ print "Illegal character %s" % `t.value[0]`
t.skip(1)
# Build the lexer
| program card'''
def p_card(t):
- 'card : TAB statement'
+ 'card : TAB statement NEWLINE'
cards.append((None, t[2]))
def p_labeled_card(t):
- 'card : NAME TAB statement'
+ 'card : NAME TAB statement NEWLINE'
cards.append((t[1], t[3]))
# Statement level
-def p_statement_assign(t):
+## DIMENSION
+def p_statement_dimension(t):
+ 'statement : DIMENSION dimension_list'
+ t[0] = ('dimension', t[1], t[2])
+def p_dimension_list(t):
+ 'dimension_list : NAME application'
+ t[0] = [[t[1], tuple(t[2])]]
+def p_dimension_list_continue(t):
+ 'dimension_list : dimension_list COMMA NAME application'
+ t[0] = t[1] + [[t[3], tuple(t[4])]]
+
+## Assignment
+def p_statement_substitution(t):
'statement : NAME EQUALS expression'
t[0] = ('substitution', t[1], t[3])
import sys
-yacc.parse(sys.stdin.read())
+yacc.parse(sys.stdin.read(), debug=2)
print cards