|
|
@ -7,6 +7,8 @@ |
|
|
|
#include "ast.h" |
|
|
|
#include "ast.h" |
|
|
|
#include "mem.h" |
|
|
|
#include "mem.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern int yylineno; |
|
|
|
|
|
|
|
|
|
|
|
ast_list *make_list(ast *elem, ast_list *tail) |
|
|
|
ast_list *make_list(ast *elem, ast_list *tail) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ast_list *list = safe_malloc(sizeof(ast_list)); |
|
|
|
ast_list *list = safe_malloc(sizeof(ast_list)); |
|
|
@ -39,6 +41,7 @@ ast *make_list_node(ast_list *list) |
|
|
|
elem->tag = node_ast; |
|
|
|
elem->tag = node_ast; |
|
|
|
elem->info.node.tag = kind_list; |
|
|
|
elem->info.node.tag = kind_list; |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -49,6 +52,7 @@ ast *make_string(char *string) |
|
|
|
|
|
|
|
|
|
|
|
elem->tag = str_ast; |
|
|
|
elem->tag = str_ast; |
|
|
|
elem->info.string = string; |
|
|
|
elem->info.string = string; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -59,6 +63,7 @@ ast *make_integer(long integer) |
|
|
|
|
|
|
|
|
|
|
|
elem->tag = int_ast; |
|
|
|
elem->tag = int_ast; |
|
|
|
elem->info.integer = integer; |
|
|
|
elem->info.integer = integer; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -69,6 +74,7 @@ ast *make_real(float real) |
|
|
|
|
|
|
|
|
|
|
|
elem->tag = real_ast; |
|
|
|
elem->tag = real_ast; |
|
|
|
elem->info.real = real; |
|
|
|
elem->info.real = real; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -84,6 +90,7 @@ ast *make_function(char *identifier, ast_list *args, ast_list *stmts) |
|
|
|
list = make_list(make_list_node(args), list); |
|
|
|
list = make_list(make_list_node(args), list); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -98,6 +105,7 @@ ast *make_fndefint(char *identifier, long num) |
|
|
|
list = make_list(make_integer(num), list); |
|
|
|
list = make_list(make_integer(num), list); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -112,6 +120,7 @@ ast *make_constant(char *identifier, long num) |
|
|
|
list = make_list(make_integer(num), list); |
|
|
|
list = make_list(make_integer(num), list); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -126,6 +135,7 @@ ast *make_realconstant(char *identifier, float num) |
|
|
|
list = make_list(make_real(num), list); |
|
|
|
list = make_list(make_real(num), list); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -139,6 +149,7 @@ ast *make_fndefext(char *identifier) |
|
|
|
elem->info.node.tag = kind_fndefext; |
|
|
|
elem->info.node.tag = kind_fndefext; |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -149,6 +160,7 @@ ast *make_variable(char *identifier) |
|
|
|
|
|
|
|
|
|
|
|
elem->tag = var_ast; |
|
|
|
elem->tag = var_ast; |
|
|
|
elem->info.variable = identifier; |
|
|
|
elem->info.variable = identifier; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -163,6 +175,7 @@ ast *make_array(char *identifier, ast *expression) |
|
|
|
list = make_list(expression, NULL); |
|
|
|
list = make_list(expression, NULL); |
|
|
|
list = make_list(make_variable(identifier), list); |
|
|
|
list = make_list(make_variable(identifier), list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -178,6 +191,7 @@ ast *make_assignment(char *identifier, ast *expression) |
|
|
|
list = make_list(expression, NULL); |
|
|
|
list = make_list(expression, NULL); |
|
|
|
list = make_list(make_variable(identifier), list); |
|
|
|
list = make_list(make_variable(identifier), list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -193,6 +207,7 @@ ast *make_assignment(ast_list *identifier_list, ast *expression) |
|
|
|
list = make_list(expression, NULL); |
|
|
|
list = make_list(expression, NULL); |
|
|
|
list = make_list(make_list_node(identifier_list), list); |
|
|
|
list = make_list(make_list_node(identifier_list), list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -207,6 +222,7 @@ ast *make_binary_op(ast_kind op, ast *exp1, ast *exp2) |
|
|
|
list = make_list(exp2, NULL); |
|
|
|
list = make_list(exp2, NULL); |
|
|
|
list = make_list(exp1, list); |
|
|
|
list = make_list(exp1, list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -220,6 +236,7 @@ ast *make_unary_op(ast_kind op, ast *exp1) |
|
|
|
elem->info.node.tag = op; |
|
|
|
elem->info.node.tag = op; |
|
|
|
list = make_list(exp1, NULL); |
|
|
|
list = make_list(exp1, NULL); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -234,6 +251,7 @@ ast *make_call(char *identifier, ast_list *args) |
|
|
|
list = make_list(make_list_node(args), NULL); |
|
|
|
list = make_list(make_list_node(args), NULL); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
list = make_list(make_string(identifier), list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -252,6 +270,7 @@ ast *make_statement(ast_kind type, ast *expression, ast_list *statements, |
|
|
|
list = make_list(make_list_node(statements), list); |
|
|
|
list = make_list(make_list_node(statements), list); |
|
|
|
list = make_list(expression, list); |
|
|
|
list = make_list(expression, list); |
|
|
|
elem->info.node.head = list; |
|
|
|
elem->info.node.head = list; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -262,6 +281,7 @@ ast *make_case_statement_variable(char *identifier) |
|
|
|
|
|
|
|
|
|
|
|
elem->tag = casevar_ast; |
|
|
|
elem->tag = casevar_ast; |
|
|
|
elem->info.variable = identifier; |
|
|
|
elem->info.variable = identifier; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -272,6 +292,7 @@ ast *make_case_statement_number(long num) |
|
|
|
|
|
|
|
|
|
|
|
elem->tag = casenum_ast; |
|
|
|
elem->tag = casenum_ast; |
|
|
|
elem->info.integer = num; |
|
|
|
elem->info.integer = num; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -283,6 +304,7 @@ ast *make_return_statement(void) |
|
|
|
elem->tag = node_ast; |
|
|
|
elem->tag = node_ast; |
|
|
|
elem->info.node.tag = stmt_return; |
|
|
|
elem->info.node.tag = stmt_return; |
|
|
|
elem->info.node.head = NULL; |
|
|
|
elem->info.node.head = NULL; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -294,6 +316,7 @@ ast *make_break_statement(void) |
|
|
|
elem->tag = node_ast; |
|
|
|
elem->tag = node_ast; |
|
|
|
elem->info.node.tag = stmt_break; |
|
|
|
elem->info.node.tag = stmt_break; |
|
|
|
elem->info.node.head = NULL; |
|
|
|
elem->info.node.head = NULL; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
@ -305,6 +328,7 @@ ast *make_default_statement(void) |
|
|
|
elem->tag = node_ast; |
|
|
|
elem->tag = node_ast; |
|
|
|
elem->info.node.tag = stmt_default; |
|
|
|
elem->info.node.tag = stmt_default; |
|
|
|
elem->info.node.head = NULL; |
|
|
|
elem->info.node.head = NULL; |
|
|
|
|
|
|
|
elem->lineno = yylineno; |
|
|
|
|
|
|
|
|
|
|
|
return elem; |
|
|
|
return elem; |
|
|
|
} |
|
|
|
} |
|
|
|