X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=tiger%2Fsrc%2Flib%2Ftiger%2Ftiger_parser.mly;h=43ec10f1955186574dcbd7e592bc0686f40228ae;hb=a87678f05df6d8d1dfd1c5ab38666c6f1fe31322;hp=35cae281f4aa6a6cd981bc9b4723e94829bff29d;hpb=ef94563423aae9f1560d78a172770b3bf944a227;p=tiger.ml.git diff --git a/tiger/src/lib/tiger/tiger_parser.mly b/tiger/src/lib/tiger/tiger_parser.mly index 35cae28..43ec10f 100644 --- a/tiger/src/lib/tiger/tiger_parser.mly +++ b/tiger/src/lib/tiger/tiger_parser.mly @@ -109,9 +109,16 @@ exp: { sprintf "string[%S]" $1 } - | fun_call + | ID LPAREN RPAREN { - $1 + let id = $1 in + sprintf "fun_call[%s, []]" id + } + | ID LPAREN fun_args RPAREN + { + let id = $1 in + let fun_args = $3 in + sprintf "fun_call[%s, %s]" id fun_args } | exp op exp { @@ -132,7 +139,7 @@ exp: { sprintf "while[%s, do[%s]]" $2 $4 } - | FOR id ASSIGN exp TO exp DO exp + | FOR ID ASSIGN exp TO exp DO exp { let id = $2 in let e1 = $4 in @@ -144,27 +151,28 @@ exp: { "break[]" } - | LPAREN seq RPAREN + | LPAREN exps RPAREN { - sprintf "seq[%s]" $2 + sprintf "exps[%s]" $2 } - | LET decs IN seq END + | LET decs IN exps END { let decs = $2 in - let seq = $4 in - sprintf "let[decs[%s], in[seq[%s]]]" decs seq + let exps = $4 in + sprintf "let[decs[%s], in[exps[%s]]]" decs exps } - | unit + | LPAREN RPAREN { - $1 + (* Perhaps "void"? *) + "unit[]" } -seq: +exps: | exp { sprintf "%s" $1 } - | exp SEMICOLON seq + | exp SEMICOLON exps { sprintf "%s; %s" $1 $3 } @@ -180,43 +188,39 @@ decs: } dec: - | tydec {$1} - | vardec {$1} - | fundec {$1} - -fundec: - | FUNCTION id unit EQ exp + /* Tydec */ + | TYPE ID EQ ID { - let id = $2 in - let exp = $5 in - sprintf "fundec[%s, exp[%s]]" id exp + let type_id_new = $2 in + let type_id_orig = $4 in + sprintf "tydec_alias[from[%s], to[%s]]" type_id_new type_id_orig } - | FUNCTION id LPAREN tyfields RPAREN EQ exp + | TYPE ID EQ LBRACE RBRACE { - let id = $2 in - let tyfields = $4 in - let exp = $7 in - sprintf "fundec[%s, tyfields[%s], exp[%s]]" id tyfields exp + let type_id = $2 in + sprintf "tydec_empty_record[%s]" type_id } - | FUNCTION id LPAREN tyfields RPAREN COLON ID EQ exp + | TYPE ID EQ LBRACE tyfields RBRACE { - let id = $2 in - let tyfields = $4 in - let type_id = $7 in - let exp = $9 in - sprintf - "fundec[%s, tyfields[%s], type_id[%s], exp[%s]]" - id tyfields type_id exp + let type_id = $2 in + let tyfields = $5 in + sprintf "tydec_record[%s, fields[%s]]" type_id tyfields + } + | TYPE ID EQ ARRAY OF ID + { + let type_id = $2 in + let element_type_id = $6 in + sprintf "tydec_array[%s, elements_of_type[%s]]" type_id element_type_id } -vardec: - | VAR id ASSIGN exp + /* Vardec */ + | VAR ID ASSIGN exp { let id = $2 in let exp = $4 in sprintf "vardec[%s, exp[%s]]" id exp } - | VAR id COLON ID ASSIGN exp + | VAR ID COLON ID ASSIGN exp { let id = $2 in let type_id = $4 in @@ -224,85 +228,60 @@ vardec: sprintf "vardec[%s, type_id[%s], exp[%s]]" id type_id exp } -tydec: - | TYPE ID EQ ty - { - let type_id = $2 in - let ty = $4 in - sprintf "tydec[%s, %s]" type_id ty - } - -ty: - | ID - { - let type_id = $1 in - sprintf "type[type_id[%S]]" type_id - } - | LBRACE RBRACE + /* Fundec */ + | FUNCTION ID LPAREN RPAREN EQ exp { - "record[]" + let id = $2 in + let exp = $6 in + sprintf "fundec[%s, arguments[], exp[%s]]" id exp } - | LBRACE tyfields RBRACE + | FUNCTION ID LPAREN tyfields RPAREN EQ exp { - let tyfields = $2 in - sprintf "record[%s]" tyfields + let id = $2 in + let tyfields = $4 in + let exp = $7 in + sprintf "fundec[%s, arguments[%s], exp[%s]]" id tyfields exp } - | ARRAY OF ID + | FUNCTION ID LPAREN tyfields RPAREN COLON ID EQ exp { - let type_id = $3 in - sprintf "array_of_type[%s]" type_id + let id = $2 in + let tyfields = $4 in + let type_id = $7 in + let exp = $9 in + sprintf + "fundec[%s, tyfields[%s], type_id[%s], exp[%s]]" + id tyfields type_id exp } tyfields: -/*| epsilon */ - | tyfield - {$1} - | tyfield COMMA tyfields + | ID COLON ID { - let tyfield = $1 in - let tyfields = $3 in - sprintf "%s, %s" tyfield tyfields + let id_1 = $1 in + let id_2 = $3 in + sprintf "%s : %s" id_1 id_2 } - -tyfield: - | id COLON ID + | ID COLON ID COMMA tyfields { - let id = $1 in - let type_id = $3 in - sprintf "tyfield[%s, %s]" id type_id - } - -id: - | ID - { - sprintf "id[%S]" $1 - } - -/* Perhaps "void"? */ -unit: - | LPAREN RPAREN - { - "unit[]" + let id_1 = $1 in + let id_2 = $3 in + let tyfield = sprintf "%s : %s" id_1 id_2 in + let tyfields = $5 in + sprintf "%s, %s" tyfield tyfields } rec_field_assignments: - | id EQ exp - { - sprintf "%S = %s" $1 $3 - } - | id EQ exp COMMA rec_field_assignments - { - sprintf "%S = %s, %s" $1 $3 $5 - } - -fun_call: - | id unit + | ID EQ exp { - sprintf "fun_call[%s, %s]" $1 $2 + let id = $1 in + let exp = $3 in + sprintf "%S = %s" id exp } - | id LPAREN fun_args RPAREN + | ID EQ exp COMMA rec_field_assignments { - sprintf "fun_call[%s, %s]" $1 $3 + let id = $1 in + let exp = $3 in + let rec_field_assignments = $5 in + sprintf "%S = %s, %s" id exp rec_field_assignments } fun_args: @@ -330,17 +309,22 @@ op: | OR {"|"} lvalue: - | id + | ID { - sprintf "lvalue[%s]" $1 + let id = $1 in + sprintf "lvalue[%s]" id } - | lvalue DOT id + | lvalue DOT ID { - sprintf "get_record_field[%s, %s]" $1 $3 + let record = $1 in + let field = $3 in + sprintf "get_record_field[%s, %s]" record field } | lvalue LBRACK exp RBRACK { - sprintf "get_array_subscript[%s, %s]" $1 $3 + let array = $1 in + let subscript = $3 in + sprintf "get_array_subscript[%s, %s]" array subscript } %%