commit 889c83368cbabf8c60517e45179639c987396fde
parent a2c43ca99846ac690f3d4c4bc556de9e92af05a9
Author: erai <erai@omiltem.net>
Date: Sat, 23 Nov 2024 14:54:06 -0500
add syntax for generics
Diffstat:
7 files changed, 351 insertions(+), 138 deletions(-)
diff --git a/cc0.c b/cc0.c
@@ -247,66 +247,68 @@ enum {
my_LOOK_AND = 2,
my_LOOK_NORMAL = 0,
my_LOOK_NOT = 1,
- my_N_ADD = 44,
- my_N_AND = 52,
- my_N_ARGDECL = 11,
- my_N_ARGLIST = 9,
- my_N_ASSIGN = 32,
- my_N_BAND = 51,
- my_N_BNOT = 49,
- my_N_BOR = 50,
- my_N_BREAK = 26,
+ my_N_ADD = 46,
+ my_N_AND = 54,
+ my_N_ARGDECL = 13,
+ my_N_ARGLIST = 11,
+ my_N_ASSIGN = 34,
+ my_N_BAND = 53,
+ my_N_BNOT = 51,
+ my_N_BOR = 52,
+ my_N_BREAK = 28,
my_N_CALL = 7,
- my_N_CAST = 36,
+ my_N_CAST = 38,
my_N_CHAR = 2,
- my_N_COND = 21,
- my_N_CONDLIST = 20,
- my_N_CONTINUE = 27,
- my_N_DEREF = 35,
- my_N_DIV = 58,
- my_N_DOT = 8,
- my_N_ENUM = 22,
- my_N_ENUMITEM = 23,
- my_N_ENUMLIST = 24,
- my_N_EQ = 42,
+ my_N_COND = 23,
+ my_N_CONDLIST = 22,
+ my_N_CONTINUE = 29,
+ my_N_DEREF = 37,
+ my_N_DIV = 60,
+ my_N_DOT = 10,
+ my_N_ENUM = 24,
+ my_N_ENUMITEM = 25,
+ my_N_ENUMLIST = 26,
+ my_N_EQ = 44,
my_N_EXPRLIST = 6,
- my_N_FUNC = 10,
- my_N_FUNCDECL = 12,
- my_N_FUNCTYPE = 14,
- my_N_GE = 41,
- my_N_GOTO = 31,
- my_N_GT = 39,
+ my_N_FUNC = 12,
+ my_N_FUNCDECL = 14,
+ my_N_FUNCTYPE = 16,
+ my_N_GE = 43,
+ my_N_GOTO = 33,
+ my_N_GT = 41,
my_N_IDENT = 0,
- my_N_INDEX = 37,
- my_N_LABEL = 30,
- my_N_LE = 40,
- my_N_LOOP = 25,
- my_N_LSH = 47,
- my_N_LT = 38,
- my_N_MEMBERDECL = 18,
- my_N_MEMBERLIST = 19,
- my_N_MOD = 59,
- my_N_MUL = 46,
- my_N_NE = 43,
- my_N_NEG = 57,
+ my_N_INDEX = 39,
+ my_N_LABEL = 32,
+ my_N_LE = 42,
+ my_N_LOOP = 27,
+ my_N_LSH = 49,
+ my_N_LT = 40,
+ my_N_MEMBERDECL = 20,
+ my_N_MEMBERLIST = 21,
+ my_N_MOD = 61,
+ my_N_MUL = 48,
+ my_N_NE = 45,
+ my_N_NEG = 59,
my_N_NIL = 4,
- my_N_NOT = 55,
+ my_N_NOT = 57,
my_N_NUM = 1,
- my_N_OR = 53,
- my_N_POS = 56,
- my_N_PROGRAM = 13,
- my_N_PTRTYPE = 15,
- my_N_REF = 34,
- my_N_RETURN = 28,
- my_N_RSH = 48,
- my_N_SIZEOF = 33,
+ my_N_OR = 55,
+ my_N_POS = 58,
+ my_N_PROGRAM = 15,
+ my_N_PTRTYPE = 17,
+ my_N_REF = 36,
+ my_N_RETURN = 30,
+ my_N_RSH = 50,
+ my_N_SIZEOF = 35,
my_N_STMTLIST = 5,
my_N_STR = 3,
- my_N_STRUCT = 16,
- my_N_SUB = 45,
- my_N_UNION = 17,
- my_N_VARDECL = 29,
- my_N_XOR = 54,
+ my_N_STRUCT = 18,
+ my_N_SUB = 47,
+ my_N_TYPECALL = 8,
+ my_N_TYPELIST = 9,
+ my_N_UNION = 19,
+ my_N_VARDECL = 31,
+ my_N_XOR = 56,
my_ONE_OR_MORE = 3,
my_OP_ADCRM = 19,
my_OP_ADDI = 129,
@@ -404,95 +406,97 @@ enum {
my_POLLNVAL = 32,
my_POLLOUT = 4,
my_POLLPRI = 2,
- my_P_add_expr = 41,
- my_P_add_op = 37,
- my_P_and_op = 45,
- my_P_arg_decl = 9,
- my_P_as = 85,
- my_P_assign_stmt = 22,
- my_P_band_op = 27,
- my_P_bnot_op = 55,
- my_P_bool_expr = 29,
- my_P_bor_op = 28,
- my_P_break = 70,
- my_P_break_stmt = 16,
- my_P_byte = 81,
- my_P_call_expr = 58,
- my_P_cast_expr = 60,
- my_P_char = 67,
- my_P_comp_expr = 36,
- my_P_compound_stmt = 25,
- my_P_continue = 75,
- my_P_continue_stmt = 17,
- my_P_dec = 65,
- my_P_deref_op = 51,
- my_P_div_op = 43,
- my_P_elif_stmt = 12,
- my_P_else = 73,
- my_P_else_stmt = 13,
- my_P_empty_stmt = 24,
- my_P_enum = 78,
+ my_P_add_expr = 42,
+ my_P_add_op = 38,
+ my_P_and_op = 46,
+ my_P_arg_decl = 10,
+ my_P_as = 87,
+ my_P_assign_stmt = 23,
+ my_P_band_op = 28,
+ my_P_bnot_op = 56,
+ my_P_bool_expr = 30,
+ my_P_bor_op = 29,
+ my_P_break = 72,
+ my_P_break_stmt = 17,
+ my_P_byte = 83,
+ my_P_call_expr = 59,
+ my_P_cast_expr = 61,
+ my_P_char = 69,
+ my_P_comp_expr = 37,
+ my_P_compound_stmt = 26,
+ my_P_continue = 77,
+ my_P_continue_stmt = 18,
+ my_P_dec = 67,
+ my_P_deref_op = 52,
+ my_P_div_op = 44,
+ my_P_elif_stmt = 13,
+ my_P_else = 75,
+ my_P_else_stmt = 14,
+ my_P_empty_stmt = 25,
+ my_P_enum = 80,
my_P_enum_decl = 2,
my_P_enum_item = 1,
- my_P_eq_op = 34,
- my_P_expr = 26,
- my_P_expr_stmt = 23,
- my_P_func = 84,
+ my_P_eq_op = 35,
+ my_P_expr = 27,
+ my_P_expr_stmt = 24,
+ my_P_func = 86,
my_P_func_decl = 6,
- my_P_func_type = 10,
- my_P_ge_op = 31,
- my_P_goto = 76,
- my_P_goto_stmt = 21,
+ my_P_func_type = 11,
+ my_P_ge_op = 32,
+ my_P_gen_decl = 9,
+ my_P_goto = 78,
+ my_P_goto_stmt = 22,
my_P_grammar = 0,
- my_P_gt_op = 33,
- my_P_hex = 64,
- my_P_ident = 87,
- my_P_if = 72,
- my_P_if_stmt = 14,
- my_P_index_expr = 57,
- my_P_int = 82,
- my_P_label_stmt = 20,
- my_P_le_op = 30,
- my_P_loop = 74,
- my_P_loop_stmt = 15,
- my_P_lsh_op = 47,
- my_P_lt_op = 32,
+ my_P_gt_op = 34,
+ my_P_hex = 66,
+ my_P_ident = 89,
+ my_P_if = 74,
+ my_P_if_stmt = 15,
+ my_P_index_expr = 58,
+ my_P_int = 84,
+ my_P_label_stmt = 21,
+ my_P_le_op = 31,
+ my_P_loop = 76,
+ my_P_loop_stmt = 16,
+ my_P_lsh_op = 48,
+ my_P_lt_op = 33,
my_P_member_decl = 3,
- my_P_member_expr = 59,
- my_P_mod_op = 44,
- my_P_mul_expr = 46,
- my_P_mul_op = 42,
- my_P_ne_op = 35,
- my_P_neg_op = 53,
- my_P_nil = 86,
- my_P_not_op = 54,
- my_P_or_op = 39,
- my_P_pos_op = 52,
- my_P_post_expr = 61,
- my_P_primary = 62,
+ my_P_member_expr = 60,
+ my_P_mod_op = 45,
+ my_P_mul_expr = 47,
+ my_P_mul_op = 43,
+ my_P_ne_op = 36,
+ my_P_neg_op = 54,
+ my_P_nil = 88,
+ my_P_not_op = 55,
+ my_P_or_op = 40,
+ my_P_pos_op = 53,
+ my_P_post_expr = 63,
+ my_P_primary = 64,
my_P_ptr_type = 8,
- my_P_ref_op = 50,
- my_P_reserved = 68,
- my_P_return = 69,
- my_P_return_stmt = 18,
- my_P_rsh_op = 48,
- my_P_shift_expr = 49,
- my_P_sizeof = 71,
- my_P_sizeof_expr = 63,
- my_P_sp = 88,
- my_P_stmt = 11,
- my_P_str = 66,
- my_P_struct = 79,
+ my_P_ref_op = 51,
+ my_P_reserved = 70,
+ my_P_return = 71,
+ my_P_return_stmt = 19,
+ my_P_rsh_op = 49,
+ my_P_shift_expr = 50,
+ my_P_sizeof = 73,
+ my_P_sizeof_expr = 65,
+ my_P_sp = 90,
+ my_P_stmt = 12,
+ my_P_str = 68,
+ my_P_struct = 81,
my_P_struct_decl = 4,
- my_P_sub_op = 38,
+ my_P_sub_op = 39,
my_P_type = 7,
- my_P_unary_expr = 56,
- my_P_union = 80,
+ my_P_type_expr = 62,
+ my_P_unary_expr = 57,
+ my_P_union = 82,
my_P_union_decl = 5,
- my_P_var = 77,
- my_P_var_stmt = 19,
- my_P_void = 83,
- my_P_xor_op = 40,
+ my_P_var = 79,
+ my_P_var_stmt = 20,
+ my_P_void = 85,
+ my_P_xor_op = 41,
my_R_CR0 = 0,
my_R_CR1 = 1,
my_R_CR2 = 2,
@@ -759,6 +763,7 @@ unsigned long( my_peg_P_func)(struct my_peg* my_c);
unsigned long( my_peg_P_func_decl)(struct my_peg* my_c);
unsigned long( my_peg_P_func_type)(struct my_peg* my_c);
unsigned long( my_peg_P_ge_op)(struct my_peg* my_c);
+unsigned long( my_peg_P_gen_decl)(struct my_peg* my_c);
unsigned long( my_peg_P_goto)(struct my_peg* my_c);
unsigned long( my_peg_P_goto_stmt)(struct my_peg* my_c);
unsigned long( my_peg_P_grammar)(struct my_peg* my_c);
@@ -804,6 +809,7 @@ unsigned long( my_peg_P_struct)(struct my_peg* my_c);
unsigned long( my_peg_P_struct_decl)(struct my_peg* my_c);
unsigned long( my_peg_P_sub_op)(struct my_peg* my_c);
unsigned long( my_peg_P_type)(struct my_peg* my_c);
+unsigned long( my_peg_P_type_expr)(struct my_peg* my_c);
unsigned long( my_peg_P_unary_expr)(struct my_peg* my_c);
unsigned long( my_peg_P_union)(struct my_peg* my_c);
unsigned long( my_peg_P_union_decl)(struct my_peg* my_c);
@@ -859,6 +865,7 @@ struct my_node*( my_reconstruct_stmt)(struct my_parser* my_c,struct my_peg_node*
struct my_node*( my_reconstruct_str)(struct my_parser* my_c,struct my_peg_node* my_pn);
struct my_node*( my_reconstruct_struct)(struct my_parser* my_c,struct my_peg_node* my_pn);
struct my_node*( my_reconstruct_type)(struct my_parser* my_c,struct my_peg_node* my_pn);
+struct my_node*( my_reconstruct_typeargs)(struct my_parser* my_c,struct my_peg_node* my_pn);
struct my_node*( my_reconstruct_unary)(struct my_parser* my_c,struct my_peg_node* my_pn);
struct my_node*( my_reconstruct_union)(struct my_parser* my_c,struct my_peg_node* my_pn);
struct my_node*( my_reconstruct_var)(struct my_parser* my_c,struct my_peg_node* my_pn);
@@ -962,6 +969,9 @@ unsigned char*( my_P_tag_to_str)(unsigned long my_tag){
if ((unsigned long)(((long)(my_tag))==((long)(my_P_ptr_type)))) {
return (unsigned char *)"ptr_type";
}
+ if ((unsigned long)(((long)(my_tag))==((long)(my_P_gen_decl)))) {
+ return (unsigned char *)"gen_decl";
+ }
if ((unsigned long)(((long)(my_tag))==((long)(my_P_arg_decl)))) {
return (unsigned char *)"arg_decl";
}
@@ -1118,6 +1128,9 @@ unsigned char*( my_P_tag_to_str)(unsigned long my_tag){
if ((unsigned long)(((long)(my_tag))==((long)(my_P_cast_expr)))) {
return (unsigned char *)"cast_expr";
}
+ if ((unsigned long)(((long)(my_tag))==((long)(my_P_type_expr)))) {
+ return (unsigned char *)"type_expr";
+ }
if ((unsigned long)(((long)(my_tag))==((long)(my_P_post_expr)))) {
return (unsigned char *)"post_expr";
}
@@ -1534,6 +1547,8 @@ unsigned long( my_call_check)(struct my_compiler* my_c,struct my_node* my_n){
(my_n)=((my_n)->my_b);
}
(my_result)=(1UL);
+ } else if ((unsigned long)(((long)((my_n)->my_kind))==((long)(my_N_TYPECALL)))) {
+ (my_result)=((my_call_check)((my_c),((my_n)->my_a)));
} else if ((unsigned long)(((unsigned long)(((long)((my_n)->my_kind))==((long)(my_N_BOR))))||((unsigned long)(((long)((my_n)->my_kind))==((long)(my_N_BAND)))))) {
(my_result)=((my_call_check)((my_c),((my_n)->my_a)));
(my_result)=((unsigned long)(((unsigned long)(my_result))|((unsigned long)((my_call_check)((my_c),((my_n)->my_b))))));
@@ -1756,6 +1771,8 @@ void( my_compile_expr)(struct my_compiler* my_c,struct my_decl* my_d,struct my_n
} else {
(my_unify)((my_c),((((my_n)->my_a)->my_t)->my_arg),((void *)0));
}
+ } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_TYPECALL)))) {
+ (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(0UL));
} else if ((unsigned long)(((long)(my_kind))==((long)(my_N_DOT)))) {
(my_compile_expr)((my_c),(my_d),((my_n)->my_a),(0UL));
if ((unsigned long)(((long)((((my_n)->my_a)->my_t)->my_kind))==((long)(my_TY_PTR)))) {
@@ -2276,6 +2293,8 @@ void( my_ctranslate_expr)(struct my_compiler* my_c,struct my_node* my_n){
}
}
(my_fputs)(((my_c)->my_cout),((unsigned char *)")"));
+ } else if ((unsigned long)(((long)((my_n)->my_kind))==((long)(my_N_TYPECALL)))) {
+ (my_ctranslate_expr)((my_c),((my_n)->my_a));
} else if ((unsigned long)(((long)((my_n)->my_kind))==((long)(my_N_DOT)))) {
(my_fputs)(((my_c)->my_cout),((unsigned char *)"("));
(my_ctranslate_expr)((my_c),((my_n)->my_a));
@@ -4965,7 +4984,7 @@ void( my_mark_expr_used)(struct my_compiler* my_c,struct my_decl* my_d,struct my
(my_mark_expr_used)((my_c),(my_d),((my_n)->my_a));
(my_mark_expr_used)((my_c),(my_d),((my_n)->my_b));
return;
- } else if ((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_REF))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_DEREF))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_BNOT))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_POS))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_NEG))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_NOT))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_CAST))))||((unsigned long)(((long)(my_kind))==((long)(my_N_DOT)))))))))))))))))) {
+ } else if ((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_REF))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_DEREF))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_BNOT))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_POS))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_NEG))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_NOT))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_CAST))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_DOT))))||((unsigned long)(((long)(my_kind))==((long)(my_N_TYPECALL)))))))))))))))))))) {
(my_mark_expr_used)((my_c),(my_d),((my_n)->my_a));
return;
} else if ((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_SIZEOF))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_STR))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_NUM))))||((unsigned long)(((unsigned long)(((long)(my_kind))==((long)(my_N_CHAR))))||((unsigned long)(((long)(my_kind))==((long)(my_N_NIL)))))))))))) {
@@ -6782,7 +6801,51 @@ unsigned long( my_peg_P_func_decl)(struct my_peg* my_c){
unsigned long( my_peg_P_func_type)(struct my_peg* my_c){
unsigned long my_ok = 0;
(my_enter)((my_c),(my_P_func_type));
+ (my_choice)((my_c));
+ (my_ok)=((my_literal)((my_c),((unsigned char *)"@")));
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
(my_ok)=((my_literal)((my_c),((unsigned char *)"(")));
+ }
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
+ (my_ok)=((my_peg_P_gen_decl)((my_c)));
+ }
+ if (my_ok) {
+ while (1) {
+ (my_choice)((my_c));
+ (my_ok)=((my_literal)((my_c),((unsigned char *)",")));
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
+ (my_ok)=((my_peg_P_gen_decl)((my_c)));
+ }
+ if ((unsigned long)(!(my_ok))) {
+ (my_ok)=(1UL);
+ break;
+ }
+ (my_commit)((my_c));
+ }
+ }
+ if (my_ok) {
+ (my_ok)=((my_literal)((my_c),((unsigned char *)")")));
+ }
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
+ (my_commit)((my_c));
+ } else {
+ (my_ok)=(1UL);
+ }
+ if (my_ok) {
+ (my_ok)=((my_literal)((my_c),((unsigned char *)"(")));
+ }
if (my_ok) {
(my_ok)=((my_peg_P_sp)((my_c)));
}
@@ -6863,6 +6926,32 @@ unsigned long( my_peg_P_ge_op)(struct my_peg* my_c){
}
return my_ok;
}
+unsigned long( my_peg_P_gen_decl)(struct my_peg* my_c){
+ unsigned long my_ok = 0;
+ (my_enter)((my_c),(my_P_gen_decl));
+ (my_ok)=((my_peg_P_ident)((my_c)));
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
+ (my_ok)=((my_literal)((my_c),((unsigned char *)":")));
+ }
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
+ (my_ok)=((my_literal)((my_c),((unsigned char *)"type")));
+ }
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
+ (my_leave)((my_c),(my_P_gen_decl));
+ } else {
+ (my_fail)((my_c));
+ }
+ return my_ok;
+}
unsigned long( my_peg_P_goto)(struct my_peg* my_c){
unsigned long my_ok = 0;
(my_enter)((my_c),(my_P_goto));
@@ -7503,6 +7592,10 @@ unsigned long( my_peg_P_post_expr)(struct my_peg* my_c){
(my_choice)((my_c));
(my_ok)=((my_peg_P_cast_expr)((my_c)));
}
+ if ((unsigned long)(!(my_ok))) {
+ (my_choice)((my_c));
+ (my_ok)=((my_peg_P_type_expr)((my_c)));
+ }
if (my_ok) {
(my_commit)((my_c));
} else {
@@ -8183,6 +8276,52 @@ unsigned long( my_peg_P_type)(struct my_peg* my_c){
}
return my_ok;
}
+unsigned long( my_peg_P_type_expr)(struct my_peg* my_c){
+ unsigned long my_ok = 0;
+ (my_enter)((my_c),(my_P_type_expr));
+ (my_ok)=((my_literal)((my_c),((unsigned char *)"@")));
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
+ (my_ok)=((my_literal)((my_c),((unsigned char *)"(")));
+ }
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
+ (my_ok)=((my_peg_P_type)((my_c)));
+ }
+ if (my_ok) {
+ while (1) {
+ (my_choice)((my_c));
+ (my_ok)=((my_literal)((my_c),((unsigned char *)",")));
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
+ (my_ok)=((my_peg_P_type)((my_c)));
+ }
+ if ((unsigned long)(!(my_ok))) {
+ (my_ok)=(1UL);
+ break;
+ }
+ (my_commit)((my_c));
+ }
+ }
+ if (my_ok) {
+ (my_ok)=((my_literal)((my_c),((unsigned char *)")")));
+ }
+ if (my_ok) {
+ (my_ok)=((my_peg_P_sp)((my_c)));
+ }
+ if (my_ok) {
+ (my_leave)((my_c),(my_P_type_expr));
+ } else {
+ (my_fail)((my_c));
+ }
+ return my_ok;
+}
unsigned long( my_peg_P_unary_expr)(struct my_peg* my_c){
unsigned long my_ok = 0;
(my_enter)((my_c),(my_P_unary_expr));
@@ -8903,7 +9042,8 @@ struct my_node*( my_reconstruct_func_type)(struct my_parser* my_c,struct my_peg_
if ((unsigned long)(!(my_pn))) {
break;
}
- if ((unsigned long)(((long)((my_pn)->my_tag))==((long)(my_P_arg_decl)))) {
+ if ((unsigned long)(((long)((my_pn)->my_tag))==((long)(my_P_gen_decl)))) {
+ } else if ((unsigned long)(((long)((my_pn)->my_tag))==((long)(my_P_arg_decl)))) {
(my_a)=((my_mknode1)((my_c),(my_N_ARGLIST),((my_reconstruct_arg_decl)((my_c),(my_pn)))));
(my_copypos)((my_a),(my_pn));
(*(my_link))=(my_a);
@@ -9118,6 +9258,10 @@ struct my_node*( my_reconstruct_post)(struct my_parser* my_c,struct my_peg_node*
(my_n)=((my_reconstruct_type)((my_c),((my_pn)->my_child)));
(my_ret)=((my_mknode)((my_c),(my_N_CAST),(my_ret),(my_n)));
(my_copypos)((my_ret),(my_pn));
+ } else if ((unsigned long)(((long)(my_tag))==((long)(my_P_type_expr)))) {
+ (my_n)=((my_reconstruct_typeargs)((my_c),((my_pn)->my_child)));
+ (my_ret)=((my_mknode)((my_c),(my_N_TYPECALL),(my_ret),(my_n)));
+ (my_copypos)((my_ret),(my_pn));
} else {
(my_die)(((unsigned char *)"invalid post_expr"));
}
@@ -9292,6 +9436,26 @@ struct my_node*( my_reconstruct_type)(struct my_parser* my_c,struct my_peg_node*
(my_die)(((unsigned char *)"reconstruct_type: invalid type"));
}
}
+struct my_node*( my_reconstruct_typeargs)(struct my_parser* my_c,struct my_peg_node* my_pn){
+ struct my_node* my_ret = 0;
+ struct my_node** my_link = 0;
+ struct my_node* my_a = 0;
+ struct my_node* my_n = 0;
+ (my_ret)=((void *)0);
+ (my_link)=(&(my_ret));
+ while (1) {
+ if ((unsigned long)(!(my_pn))) {
+ break;
+ }
+ (my_a)=((my_reconstruct_type)((my_c),(my_pn)));
+ (my_n)=((my_mknode1)((my_c),(my_N_TYPELIST),(my_a)));
+ (my_copypos)((my_n),(my_pn));
+ (*(my_link))=(my_n);
+ (my_link)=(&((my_n)->my_b));
+ (my_pn)=((my_pn)->my_next);
+ }
+ return my_ret;
+}
struct my_node*( my_reconstruct_unary)(struct my_parser* my_c,struct my_peg_node* my_pn){
struct my_node* my_n = 0;
struct my_node* my_ret = 0;
@@ -9864,6 +10028,9 @@ void( my_typecheck_expr)(struct my_compiler* my_c,struct my_decl* my_d,struct my
(my_unify)((my_c),((((my_n)->my_a)->my_t)->my_arg),((void *)0));
}
((my_n)->my_t)=((((my_n)->my_a)->my_t)->my_val);
+ } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_TYPECALL)))) {
+ (my_typecheck_expr)((my_c),(my_d),((my_n)->my_a),(0UL));
+ ((my_n)->my_t)=(((my_n)->my_a)->my_t);
} else if ((unsigned long)(((long)(my_kind))==((long)(my_N_DOT)))) {
(my_typecheck_expr)((my_c),(my_d),((my_n)->my_a),(0UL));
if ((unsigned long)(((long)((((my_n)->my_a)->my_t)->my_kind))==((long)(my_TY_PTR)))) {
diff --git a/cc1.om b/cc1.om
@@ -262,7 +262,7 @@ func mark_expr_used(c: *compiler, d: *decl, n: *node) {
return;
} else if kind == N_REF || kind == N_DEREF || kind == N_BNOT
|| kind == N_POS || kind == N_NEG || kind == N_NOT
- || kind == N_CAST || kind == N_DOT {
+ || kind == N_CAST || kind == N_DOT || kind == N_TYPECALL {
mark_expr_used(c, d, n.a);
return;
} else if kind == N_SIZEOF || kind == N_STR || kind == N_NUM
@@ -727,6 +727,9 @@ func typecheck_expr(c: *compiler, d: *decl, n: *node, rhs: int) {
}
n.t = n.a.t.val;
+ } else if (kind == N_TYPECALL) {
+ typecheck_expr(c, d, n.a, 0);
+ n.t = n.a.t;
} else if (kind == N_DOT) {
typecheck_expr(c, d, n.a, 0);
@@ -1385,6 +1388,8 @@ func compile_expr(c: *compiler, d: *decl, n: *node, rhs: int) {
} else {
unify(c, n.a.t.arg, nil);
}
+ } else if (kind == N_TYPECALL) {
+ compile_expr(c, d, n.a, 0);
} else if (kind == N_DOT) {
compile_expr(c, d, n.a, 0);
@@ -1619,6 +1624,8 @@ func call_check(c: *compiler, n: *node): int {
n = n.b;
}
result = 1;
+ } else if n.kind == N_TYPECALL {
+ result = call_check(c, n.a);
} else if n.kind == N_BOR || n.kind == N_BAND {
// Side effects okay in both positions
result = call_check(c, n.a);
diff --git a/cc3.peg b/cc3.peg
@@ -14,8 +14,10 @@ type <- ident sp / byte sp / int sp / void sp
ptr_type <- '*' sp type
+gen_decl <- ident sp ':' sp 'type' sp
arg_decl <- ident sp ':' sp type
-func_type <- '(' sp ( arg_decl (',' sp arg_decl)* )? ( ',' sp )? ')' sp
+func_type <- ('@' sp '(' sp gen_decl ( ',' sp gen_decl )* ')' sp)?
+ '(' sp ( arg_decl (',' sp arg_decl)* )? ( ',' sp )? ')' sp
(':' sp type)?
stmt <- if_stmt / loop_stmt / break_stmt / continue_stmt
@@ -90,7 +92,8 @@ index_expr <- '[' sp expr ']' sp
call_expr <- '(' sp ( expr (',' sp expr)* )? (',' sp)? ')' sp
member_expr <- '.' sp ident sp
cast_expr <- 'as' sp type
-post_expr <- primary (index_expr / call_expr / member_expr / cast_expr)*
+type_expr <- '@' sp '(' sp type (',' sp type)* ')' sp
+post_expr <- primary (index_expr / call_expr / member_expr / cast_expr / type_expr)*
primary <- ident sp / hex sp / dec sp / str sp / char sp
/ sizeof_expr / nil sp / '(' sp expr ')' sp
diff --git a/cout.om b/cout.om
@@ -340,6 +340,8 @@ func ctranslate_expr(c: *compiler, n: *node) {
}
}
fputs(c.cout, ")");
+ } else if n.kind == N_TYPECALL {
+ ctranslate_expr(c, n.a);
} else if n.kind == N_DOT {
fputs(c.cout, "(");
ctranslate_expr(c, n.a);
diff --git a/node.om b/node.om
@@ -19,6 +19,8 @@ enum {
N_STMTLIST,
N_EXPRLIST,
N_CALL,
+ N_TYPECALL,
+ N_TYPELIST,
N_DOT,
N_ARGLIST,
N_FUNC,
diff --git a/parse2.om b/parse2.om
@@ -191,7 +191,8 @@ func reconstruct_func_type(c: *parser, pn: *peg_node): *node {
break;
}
- if pn.tag == P_arg_decl {
+ if pn.tag == P_gen_decl {
+ } else if pn.tag == P_arg_decl {
a = mknode1(c, N_ARGLIST, reconstruct_arg_decl(c, pn));
copypos(a, pn);
*link = a;
@@ -552,6 +553,31 @@ func reconstruct_args(c: *parser, pn: *peg_node): *node {
return ret;
}
+func reconstruct_typeargs(c: *parser, pn: *peg_node): *node {
+ var ret: *node;
+ var link: **node;
+ var a: *node;
+ var n: *node;
+
+ ret = nil;
+ link = &ret;
+ loop {
+ if !pn {
+ break;
+ }
+
+ a = reconstruct_type(c, pn);
+ n = mknode1(c, N_TYPELIST, a);
+ copypos(n, pn);
+
+ *link = n;
+ link = &n.b;
+
+ pn = pn.next;
+ }
+
+ return ret;
+}
func reconstruct_post(c: *parser, pn: *peg_node): *node {
var ret: *node;
@@ -585,6 +611,10 @@ func reconstruct_post(c: *parser, pn: *peg_node): *node {
n = reconstruct_type(c, pn.child);
ret = mknode(c, N_CAST, ret, n);
copypos(ret, pn);
+ } else if tag == P_type_expr {
+ n = reconstruct_typeargs(c, pn.child);
+ ret = mknode(c, N_TYPECALL, ret, n);
+ copypos(ret, pn);
} else {
die("invalid post_expr");
}
diff --git a/vimfiles/syntax/omiltem.vim b/vimfiles/syntax/omiltem.vim
@@ -22,6 +22,7 @@ syn keyword oInt int
syn keyword oVoid void
syn keyword oFunc func
syn keyword oAs as
+syn keyword oType type
syn keyword oNil nil
syn keyword oTodo contained TODO FIXME XXX BUG
@@ -71,5 +72,6 @@ hi def link oByte Type
hi def link oInt Type
hi def link oVoid Type
hi def link oFunc Type
+hi def link oType Type
let b:current_syntax = "omiltem"