[FEAT] Working on array and struct support on expressions

This commit is contained in:
2021-05-04 14:58:21 +02:00
parent 567710779a
commit 58808d33a5
3 changed files with 43 additions and 21 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -4,7 +4,7 @@
struct t_struct {
std::string name;
int size;
uint32_t size;
std::vector<t_variable> members;
};
static std::vector<t_struct> 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;