X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=tiger%2Fsrc%2Flib%2Ftiger%2Ftiger_parser.mly;h=4497ce30eb51bcb491467fe78e97ba796b2623bc;hb=29de275c04959d47f3a8b03443e7d9b48853daeb;hp=157a8a6159e6b3645e0392dd3f793f005dd554f6;hpb=543d34200923ddd3fedc247b7d663ee46733f0f1;p=tiger.ml.git diff --git a/tiger/src/lib/tiger/tiger_parser.mly b/tiger/src/lib/tiger/tiger_parser.mly index 157a8a6..4497ce3 100644 --- a/tiger/src/lib/tiger/tiger_parser.mly +++ b/tiger/src/lib/tiger/tiger_parser.mly @@ -82,13 +82,20 @@ exp: { sprintf "negation[%s]" $2 } - | type_id LBRACK exp RBRACK OF exp + | ID LBRACK exp RBRACK OF exp { - sprintf "array[type[%s], size[%s], val[%s]]" $1 $3 $6 + let type_id = $1 in + let exp_1 = $3 in + let exp_2 = $6 in + sprintf "array[type[%s], size[%s], val[%s]]" type_id exp_1 exp_2 } - | type_id LBRACE rec_field_assignments RBRACE + | ID LBRACE rec_field_assignments RBRACE { - sprintf "record[type[%s], rec_field_assignments[%s]]" $1 $3 + let type_id = $1 in + let rec_field_assignments = $3 in + sprintf + "record[type[%s], rec_field_assignments[%s]]" + type_id rec_field_assignments } | lvalue { @@ -102,9 +109,16 @@ exp: { sprintf "string[%S]" $1 } - | fun_call + | ID unit { - $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 { @@ -125,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 @@ -178,14 +192,20 @@ dec: | fundec {$1} fundec: - | FUNCTION id LPAREN tyfields RPAREN EQ exp + | FUNCTION ID unit EQ exp + { + let id = $2 in + let exp = $5 in + sprintf "fundec[%s, exp[%s]]" id exp + } + | FUNCTION ID LPAREN tyfields RPAREN EQ exp { let id = $2 in let tyfields = $4 in let exp = $7 in sprintf "fundec[%s, tyfields[%s], exp[%s]]" id tyfields exp } - | FUNCTION id LPAREN tyfields RPAREN COLON type_id EQ exp + | FUNCTION ID LPAREN tyfields RPAREN COLON ID EQ exp { let id = $2 in let tyfields = $4 in @@ -197,29 +217,34 @@ fundec: } vardec: - | VAR id ASSIGN exp + | VAR ID ASSIGN exp { let id = $2 in let exp = $4 in sprintf "vardec[%s, exp[%s]]" id exp } - | VAR id COLON type_id ASSIGN exp + | VAR ID COLON ID ASSIGN exp { let id = $2 in - let tyid = $4 in + let type_id = $4 in let exp = $6 in - sprintf "vardec[%s, type_id[%s], exp[%s]]" id tyid exp + sprintf "vardec[%s, type_id[%s], exp[%s]]" id type_id exp } tydec: - | TYPE type_id EQ ty + | TYPE ID EQ ty { - sprintf "tydec[%s, %s]" $2 $4 + let type_id = $2 in + let ty = $4 in + sprintf "tydec[%s, %s]" type_id ty } ty: - | type_id - {$1} + | ID + { + let type_id = $1 in + sprintf "type[type_id[%S]]" type_id + } | LBRACE RBRACE { "record[]" @@ -229,7 +254,7 @@ ty: let tyfields = $2 in sprintf "record[%s]" tyfields } - | ARRAY OF type_id + | ARRAY OF ID { let type_id = $3 in sprintf "array_of_type[%s]" type_id @@ -247,19 +272,13 @@ tyfields: } tyfield: - | id COLON type_id + | ID COLON ID { 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 @@ -267,30 +286,19 @@ unit: "unit[]" } -type_id: - | id - { - sprintf "type_id[%S]" $1 - } - rec_field_assignments: - | id EQ exp - { - sprintf "%S = %s" $1 $3 - } - | id EQ exp COMMA rec_field_assignments + | ID EQ exp { - sprintf "%S = %s, %s" $1 $3 $5 - } - -fun_call: - | id unit - { - 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: @@ -318,17 +326,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 } %%