diff --git a/parser.cpp b/parser.cpp index 3c3f150..18389f5 100644 --- a/parser.cpp +++ b/parser.cpp @@ -218,7 +218,7 @@ static void generate_anonymous_labelname(char* dest) { static void parse_expression(); static void parse_statements(); -/* [RZC 27/04/2021] No usat en JailBasic +/* XXX [RZC 27/04/2021] No usat en JailBasic //static void parse_strleft(); static void parse_str(); static void parse_chr(); @@ -277,6 +277,22 @@ static void parse_concatenation() { } */ +static int get_variable_address() { + int address = scope_get_variable_address(); + const uint32_t var_length = scope_get_variable_size(); + const uint32_t var_type = scope_get_variable_type(); + if (var_length > 1) { + tkn_next(); EXPECT(TOKEN_LBRACKET, "Expected '['"); + tkn_next(); EXPECT(TOKEN_NUMBER, "Expected number"); + const float index = tkn_get_value(); + tkn_next(); EXPECT(TOKEN_LBRACKET, "Expected ']'"); + address += index * types_get_length(var_type); + } + if (var_type >= 2) { + + } +} + static void parse_expr_atom() { // NUM, VAR, UNARY, PAREN if (tkn_get_token() == TOKEN_NUMBER) { @@ -287,17 +303,17 @@ static void parse_expr_atom() { } if (tkn_get_token() == TOKEN_IDENTIFIER) { if (scope_variable_exists(tkn_get_string())) { - // [RZC 03/05/2021] TODO: Revisar si hi ha que navegar un struct o array + // TODO [RZC 03/05/2021] Revisar si hi ha que navegar un struct o array emmit(scope_is_local() ? OP_LDL : OP_LD); emmit(scope_get_variable_address()); tkn_next(); return; } else { - // [RZC 03/05/2021] TODO: Revisar funcions + // TODO [RZC 03/05/2021] Revisar funcions parser_finished = true; error_raise("Unknown identifier"); return; } - // [RZC 27/04/2021] Per ara llevem les constants + // XXX [RZC 27/04/2021] Per ara llevem les constants /*int constvalue = get_constant(tkn_get_string()); if (constvalue != -1) { emmit(OP_PUSH); @@ -306,7 +322,7 @@ static void parse_expr_atom() { return; }*/ - // [RZC 27/04/2021] Per ara llevem les variables + // XXX [RZC 27/04/2021] Per ara llevem les variables /*int ivar = get_variable_index(tkn_get_string()); if (is_variable_array()) { tkn_next(); EXPECT(TOKEN_LPAR, "Expected array index"); @@ -339,7 +355,7 @@ static void parse_expr_atom() { tkn_next(); return; } - // [RZC 27/04/2021] No usat en JailBasic, pero hi haurà que afegir les funcions + // XXX [RZC 27/04/2021] No usat en JailBasic, pero hi haurà que afegir les funcions /* if (tkn_get_token() == TOKEN_STRLEN) { tkn_next(); parse_strlen(); return; } if (tkn_get_token() == TOKEN_KEYPRESSED) { tkn_next(); parse_keypressed(); return; } @@ -444,7 +460,7 @@ static void parse_var() { tkn_next(); if (tkn_get_token() == TOKEN_ARRAY) { tkn_next(); EXPECT(TOKEN_OF, "Expected 'of'"); - tkn_next(); EXPECT(TOKEN_NUMBER, "Expected number"); // [RZC 04/05/2021] TODO: Només deuria acceptar enters. + tkn_next(); EXPECT(TOKEN_NUMBER, "Expected number"); // TODO [RZC 04/05/2021] Només deuria acceptar enters. var_length = tkn_get_value(); tkn_next(); } @@ -478,7 +494,7 @@ static void parse_struct() { char member_name[40]; strcpy(member_name, tkn_get_string()); tkn_next(); EXPECT(TOKEN_AS, "Expected 'as'"); - // [RZC 04/05/2021] TODO: Implement support for arrays + // TODO [RZC 04/05/2021] Implement support for arrays tkn_next(); EXPECT(TOKEN_IDENTIFIER, "Expected type identifier"); char type_name[40]; strcpy(type_name, tkn_get_string()); @@ -500,7 +516,7 @@ static void parse_struct() { tkn_next(); EXPECT(TOKEN_RPAR, "Expected ')'"); tkn_next(); }*/ -// [RZC 27/04/2021] Desactivat INC i DEC per ara +// XXX [RZC 27/04/2021] Desactivat INC i DEC per ara /*static void parse_inc() { EXPECT(TOKEN_IDENTIFIER, "Expected variable"); int ivar = get_variable_index(tkn_get_string()); @@ -548,7 +564,7 @@ static void parse_dec() { tkn_next(); }*/ -// [RZC 27/04/2021] Desactivat, no se molt be ni què es +// XXX [RZC 27/04/2021] Desactivat, no se molt be ni què es /*static void parse_let() { EXPECT(TOKEN_IDENTIFIER, "Expected variable"); int ivar = get_variable_index(tkn_get_string()); @@ -673,7 +689,7 @@ static void parse_continue() { } */ -// [RZC 27/04/2021] Ni GOTO ni GOSUB +// XXX [RZC 27/04/2021] Ni GOTO ni GOSUB /*static void parse_goto() { emmit(OP_JMP); EXPECT(TOKEN_IDENTIFIER, "Expected label name"); @@ -690,12 +706,12 @@ static void parse_gosub() { /* static void parse_return() { - // [RZC 27/04/2021] [TODO] Falta afegir paràmetre de retorn + // TODO [RZC 27/04/2021] Falta afegir paràmetre de retorn emmit(OP_RET); } */ -// [RZC 27/04/2021] No hi ha labels +// XXX [RZC 27/04/2021] No hi ha labels /*static void parse_label() { register_label_address(tkn_get_string()); tkn_next(); @@ -785,7 +801,7 @@ static void parse_global_statements() { } } -// [RZC 27/04/2021] No usat en JailBasic +// XXX [RZC 27/04/2021] No usat en JailBasic /*static void include_labels() { FILE *f = fopen("rom.lbl", "rb"); byte num_labels; @@ -815,13 +831,13 @@ void parser_parse(const char* buffer, byte* mem) { parser_finished = false; //include_labels(); code = mem; - codepos = 2; // [RZC 27/04/2021] [TODO] Perquè 2? + codepos = 2; // XXX [RZC 27/04/2021] Perquè 2? tkn_next(); parse_global_statements(); - //append_strings(); // [RZC 27/04/2021] [TODO] Encara vull açò? si el bytecode no ha de ser independent, no veig que faça falta + //append_strings(); // XXX [RZC 27/04/2021] Encara vull açò? si el bytecode no ha de ser independent, no veig que faça falta - if (error_raised()) { // [RZC 27/04/2021] Res, per ara que printf el error i pete + if (error_raised()) { // XXX [RZC 27/04/2021] Res, per ara que printf el error i pete error_print(NULL); //codepos = 0xA000; //emmit(OP_JMP); diff --git a/test.vb b/test.vb index 84cdab4..444e263 100644 --- a/test.vb +++ b/test.vb @@ -4,5 +4,11 @@ struct point y as number end -var peiv as point +struct triangle + a as point + b as point + c as point +end + +var peiv as array of 2 triangle const perico as number = 4-peiv diff --git a/types.cpp b/types.cpp index c817e2f..56b39fe 100644 --- a/types.cpp +++ b/types.cpp @@ -4,7 +4,7 @@ struct t_struct { std::string name; - int size; + uint32_t size; std::vector members; }; static std::vector types; @@ -17,7 +17,7 @@ void types_init() { const int types_add(const std::string name) { for (auto t : types) if (t.name == name) return -1; - t_struct new_type; new_type.name = name; + t_struct new_type {name, 0}; types.push_back(new_type); return types.size()-1; } @@ -35,7 +35,7 @@ const int types_get_length(const uint32_t type) { const int types_add_member(const uint32_t type, const std::string name, const uint32_t var_type, const uint32_t length) { if (type >= types.size()) return -1; // ERROR INTERN: No deuria donar-se mai for (auto m : types[type].members) if (m.name == name) return -1; - const t_variable new_var {name, var_type, length}; + const t_variable new_var {name, var_type, length, types[type].size}; types[type].members.push_back(new_var); types[type].size += types_get_length(var_type) + length; return types[type].members.size()-1;