tokens = reserved + (
'EOS', 'COMMA',
- 'NAME','ARRAYNAME','INTNUM', 'DOUBLENUM', 'BOOLNUM', 'STRING', 'FUNCALL',
+ 'NAME','INTNUM', 'DOUBLENUM', 'BOOLNUM', 'STRING', 'FUNCALL',
'LPAREN','RPAREN',
'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
'NOT', 'OR', 'AND', 'THEN', 'EQV',
for r in reserved:
reserved_map[r] = r
-def t_ARRAYNAME(t):
- r'%[A-Z][A-Z0-9]*'
- t.value = t.value.lower()[1:]
- return t
-
def t_NAME(t):
r'[A-Z][A-Z0-9_]*(\.(?!P))?'
t.type = reserved_map.get(t.value, 'NAME')
'statement : DIMENSION dimension_list'
t[0] = ('dimension', t[2])
def p_dimension_list(t):
- 'dimension_list : ARRAYNAME application'
+ 'dimension_list : NAME application'
t[0] = [[t[1], tuple(t[2])]]
def p_dimension_list_continue(t):
- 'dimension_list : dimension_list COMMA ARRAYNAME application'
+ 'dimension_list : dimension_list COMMA NAME application'
t[0] = t[1] + [[t[3], tuple(t[4])]]
## END
| expression'''
t[0] = t[1]
def p_range(t):
- 'range : ARRAYNAME application DOTRANGE ARRAYNAME application'
+ 'range : NAME application DOTRANGE NAME application'
t[0] = ('range', t[1], t[2], t[5])
if t[1] != t[4]:
sys.stderr.write("variable names in range don't match!")
t[0] = ('doublenum', t[1])
def p_expression_subscript(t):
- 'expression : ARRAYNAME application'
+ 'expression : NAME application'
t[0] = ('variable', t[1], tuple(t[2]))
var = t[1]
refcount[var] = refcount.get(var, 0) + 1
source = source.replace("SET LIST TO", "SET_LIST_TO")
source = source.replace("PRINT FORMAT", "PRINT_FORMAT")
source = source.replace("READ FORMAT", "READ_FORMAT")
- # SLR parsing seems to be a tad too weak for the full grammar of MAD.
- # It hits lookahead problens in parsing array references and array
- # ranges -- doesn't know that it should look ahead far enough to
- # see the leading paren on the subscript. So, decorate array
- # references in a way that will make them syntactucally obvious.
- source = re.sub(r"[A-Z][A-Z0-9]*\s*\(", r"%\g<0>", source)
# Lex or parse
if lexercise:
lex.input(source)