From cdc02509321245a38f3815c789d8a17aaca3f714 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Wed, 14 Jan 2004 09:58:44 +0000 Subject: [PATCH] We can parse function calls now. --- mad | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 9 deletions(-) diff --git a/mad b/mad index 6b0eecd..a508c96 100755 --- a/mad +++ b/mad @@ -1,11 +1,13 @@ #!/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', @@ -38,16 +40,18 @@ t_DIVIDE = r'/' 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" @@ -105,6 +109,38 @@ def p_dimension_list_continue(t): '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' @@ -119,6 +155,25 @@ def p_map_continue(t): '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' @@ -169,17 +224,21 @@ def p_expression_group(t): 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] @@ -209,5 +268,6 @@ import sys, re 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 -- 2.43.0