[FEAT] Structs and arrays supported as expression atoms
This commit is contained in:
43
parser.cpp
43
parser.cpp
@@ -231,7 +231,9 @@ static void parse_getcolor();
|
||||
*/
|
||||
|
||||
#define EXPECT(X, Y) if (tkn_get_token() != X) { parser_finished = true; error_raise(Y); return; }
|
||||
#define EXPECT2(X, Y) if (tkn_get_token() != X) { parser_finished = true; error_raise(Y); return -1; }
|
||||
#define HALT(Y) { parser_finished = true; error_raise(Y); return; }
|
||||
#define HALT2(Y) { parser_finished = true; error_raise(Y); return -1; }
|
||||
|
||||
/*
|
||||
static void parse_concat_atom() {
|
||||
@@ -279,17 +281,31 @@ 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) {
|
||||
|
||||
uint32_t var_length = scope_get_variable_size();
|
||||
uint32_t var_type = scope_get_variable_type();
|
||||
|
||||
while (true) {
|
||||
// Si es un array...
|
||||
if (var_length > 1) {
|
||||
tkn_next(); EXPECT2(TOKEN_LBRACKET, "Expected '['");
|
||||
tkn_next(); EXPECT2(TOKEN_NUMBER, "Expected number");
|
||||
const float index = tkn_get_value();
|
||||
tkn_next(); EXPECT2(TOKEN_RBRACKET, "Expected ']'");
|
||||
address += index * types_get_length(var_type);
|
||||
}
|
||||
// Si es un struct...
|
||||
if (var_type >= 2) {
|
||||
tkn_next(); EXPECT2(TOKEN_DOT, "Expected '.'");
|
||||
tkn_next(); EXPECT2(TOKEN_IDENTIFIER, "Expected identifier");
|
||||
const std::string member_name = tkn_get_string();
|
||||
const int member_num = types_member_exists(var_type, member_name);
|
||||
if (member_num == -1) HALT2("Unknown member");
|
||||
address += types_get_member_offset(var_type, member_num);
|
||||
var_length = types_get_member_length(var_type, member_num);
|
||||
var_type = types_get_member_type(var_type, member_num);
|
||||
} else {
|
||||
return address;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -303,9 +319,10 @@ static void parse_expr_atom() {
|
||||
}
|
||||
if (tkn_get_token() == TOKEN_IDENTIFIER) {
|
||||
if (scope_variable_exists(tkn_get_string())) {
|
||||
// TODO [RZC 03/05/2021] Revisar si hi ha que navegar un struct o array
|
||||
const int address = get_variable_address();
|
||||
if (address == -1) return;
|
||||
emmit(scope_is_local() ? OP_LDL : OP_LD);
|
||||
emmit(scope_get_variable_address());
|
||||
emmit(address);
|
||||
tkn_next();
|
||||
return;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user