#!/usr/bin/env python
-reserved = ('DIMENSION', 'FOR', 'OF', 'THROUGH', 'VALUES')
+reserved = ('CONDITIONAL', 'DIMENSION', 'END', 'FOR', 'FORMAT',
+ 'FUNCTION', 'INTEGER', 'OF', 'PRINT', 'PROGRAM', 'READ',
+ 'THROUGH', 'TO', 'TRANSFER', 'VALUES', 'VECTOR', 'WHENEVER')
tokens = reserved + (
'TAB', 'SEMI',
'COMMA',
- 'NAME','INTEGER', 'FLOAT',
+ 'NAME','INTNUM', 'FLOATNUM', 'FUNCALL',
'LPAREN','RPAREN',
'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
'NOT', 'OR', 'AND', 'THEN', 'EQV',
t_EQUALS = r'='
t_LPAREN = r'\('
t_RPAREN = r'\)'
-t_FLOAT = r'\d+\.\d*'
-t_INTEGER = r'\d+'
+t_FLOATNUM= r'\d+\.\d*'
+t_INTNUM = r'\d+'
reserved_map = { }
for r in reserved:
reserved_map[r] = r
def t_NAME(t):
- r'[a-zA-Z_][a-zA-Z0-9_]*'
+ r'[A-Z][A-Z0-9]*\.?'
t.type = reserved_map.get(t.value, "NAME")
+ if t.type and t.value[-1] == '.':
+ t.type = 'FUNCALL'
return t
t_ignore = " \n"
'dimension_list : dimension_list COMMA NAME application'
t[0] = t[1] + [[t[3], tuple(t[4])]]
+## END
+def p_end_of_program(t):
+ "statement : END OF PROGRAM"
+ t[0] = ('end_program')
+def p_end_of_conditional(t):
+ "statement : END OF CONDITIONAL"
+ t[0] = ('end_conditional')
+def p_end_of_functions(t):
+ "statement : END OF FUNCTION"
+ t[0] = ('end_function')
+
+## INTEGER
+def p_integer(t):
+ "statement : INTEGER varlist"
+ t[0] = ('integer',) + tuple(t[2])
+def p_varlist(t):
+ 'varlist : NAME'
+ t[0] = [t[1]]
+def p_varlist_continue(t):
+ 'varlist : varlist COMMA NAME'
+ t[0] = t[1] + [t[3]]
+
+## READ FORMAT
+def p_read_format(t):
+ "statement : READ FORMAT varlist"
+ t[0] = ('read',) + tuple(t[3])
+
+## PRINT FORMAT
+def p_print_format(t):
+ "statement : PRINT FORMAT varlist"
+ t[0] = ('print',) + tuple(t[3])
+
## THROUGH
def p_through_for(t):
'statement : THROUGH NAME COMMA FOR NAME EQUALS expression COMMA expression COMMA expression'
'value_list : value_list COMMA expression'
t[0] = t[1] + [t[3]]
+## TRANSFER TO
+def p_transfer(t):
+ "statement : TRANSFER TO NAME"
+ t[0] = ('goto', t[3])
+
+## WHENEVER
+def p_whenever_simple(t):
+ 'statement : WHENEVER expression COMMA statement'
+ t[0] = ('if', t[2], t[4])
+def p_whenever_complex(t):
+ 'statement : WHENEVER expression'
+ t[0] = ('whenever', t[2], t[4])
+
+## VECTOR VALUES
+#def p_vector_values(t):
+# "statement : VECTOR VALUES assignlist"
+# t[0] = ('values',) + tuple(t[3])
+
+
## Assignment
def p_statement_substitution(t):
'statement : NAME EQUALS expression'
t[0] = t[2]
def p_expression_integer(t):
- 'expression : INTEGER'
+ 'expression : INTNUM'
t[0] = ('integer', t[1])
def p_expression_float(t):
- 'expression : FLOAT'
+ 'expression : FLOATNUM'
t[0] = ('float', t[1])
def p_expression_subscript(t):
'expression : NAME application'
t[0] = ('variable', t[1], tuple(t[2]))
+def p_function_application(t):
+ 'expression : FUNCALL application'
+ t[0] = ('apply', t[1], tuple(t[2]))
+
def p_expression_application(t):
"application : LPAREN inner_expression RPAREN"
t[0] = t[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
+yacc.parse(source, debug=1)
+for card in cards:
+ print card