[FEAT] Working on array and struct support on expressions
This commit is contained in:
50
parser.cpp
50
parser.cpp
@@ -218,7 +218,7 @@ static void generate_anonymous_labelname(char* dest) {
|
|||||||
static void parse_expression();
|
static void parse_expression();
|
||||||
static void parse_statements();
|
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_strleft();
|
||||||
static void parse_str();
|
static void parse_str();
|
||||||
static void parse_chr();
|
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() {
|
static void parse_expr_atom() {
|
||||||
// NUM, VAR, UNARY, PAREN
|
// NUM, VAR, UNARY, PAREN
|
||||||
if (tkn_get_token() == TOKEN_NUMBER) {
|
if (tkn_get_token() == TOKEN_NUMBER) {
|
||||||
@@ -287,17 +303,17 @@ static void parse_expr_atom() {
|
|||||||
}
|
}
|
||||||
if (tkn_get_token() == TOKEN_IDENTIFIER) {
|
if (tkn_get_token() == TOKEN_IDENTIFIER) {
|
||||||
if (scope_variable_exists(tkn_get_string())) {
|
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_is_local() ? OP_LDL : OP_LD);
|
||||||
emmit(scope_get_variable_address());
|
emmit(scope_get_variable_address());
|
||||||
tkn_next();
|
tkn_next();
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
// [RZC 03/05/2021] TODO: Revisar funcions
|
// TODO [RZC 03/05/2021] Revisar funcions
|
||||||
parser_finished = true; error_raise("Unknown identifier");
|
parser_finished = true; error_raise("Unknown identifier");
|
||||||
return;
|
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());
|
/*int constvalue = get_constant(tkn_get_string());
|
||||||
if (constvalue != -1) {
|
if (constvalue != -1) {
|
||||||
emmit(OP_PUSH);
|
emmit(OP_PUSH);
|
||||||
@@ -306,7 +322,7 @@ static void parse_expr_atom() {
|
|||||||
return;
|
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());
|
/*int ivar = get_variable_index(tkn_get_string());
|
||||||
if (is_variable_array()) {
|
if (is_variable_array()) {
|
||||||
tkn_next(); EXPECT(TOKEN_LPAR, "Expected array index");
|
tkn_next(); EXPECT(TOKEN_LPAR, "Expected array index");
|
||||||
@@ -339,7 +355,7 @@ static void parse_expr_atom() {
|
|||||||
tkn_next();
|
tkn_next();
|
||||||
return;
|
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_STRLEN) { tkn_next(); parse_strlen(); return; }
|
||||||
if (tkn_get_token() == TOKEN_KEYPRESSED) { tkn_next(); parse_keypressed(); return; }
|
if (tkn_get_token() == TOKEN_KEYPRESSED) { tkn_next(); parse_keypressed(); return; }
|
||||||
@@ -444,7 +460,7 @@ static void parse_var() {
|
|||||||
tkn_next();
|
tkn_next();
|
||||||
if (tkn_get_token() == TOKEN_ARRAY) {
|
if (tkn_get_token() == TOKEN_ARRAY) {
|
||||||
tkn_next(); EXPECT(TOKEN_OF, "Expected 'of'");
|
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();
|
var_length = tkn_get_value();
|
||||||
tkn_next();
|
tkn_next();
|
||||||
}
|
}
|
||||||
@@ -478,7 +494,7 @@ static void parse_struct() {
|
|||||||
char member_name[40];
|
char member_name[40];
|
||||||
strcpy(member_name, tkn_get_string());
|
strcpy(member_name, tkn_get_string());
|
||||||
tkn_next(); EXPECT(TOKEN_AS, "Expected 'as'");
|
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");
|
tkn_next(); EXPECT(TOKEN_IDENTIFIER, "Expected type identifier");
|
||||||
char type_name[40];
|
char type_name[40];
|
||||||
strcpy(type_name, tkn_get_string());
|
strcpy(type_name, tkn_get_string());
|
||||||
@@ -500,7 +516,7 @@ static void parse_struct() {
|
|||||||
tkn_next(); EXPECT(TOKEN_RPAR, "Expected ')'");
|
tkn_next(); EXPECT(TOKEN_RPAR, "Expected ')'");
|
||||||
tkn_next();
|
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() {
|
/*static void parse_inc() {
|
||||||
EXPECT(TOKEN_IDENTIFIER, "Expected variable");
|
EXPECT(TOKEN_IDENTIFIER, "Expected variable");
|
||||||
int ivar = get_variable_index(tkn_get_string());
|
int ivar = get_variable_index(tkn_get_string());
|
||||||
@@ -548,7 +564,7 @@ static void parse_dec() {
|
|||||||
tkn_next();
|
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() {
|
/*static void parse_let() {
|
||||||
EXPECT(TOKEN_IDENTIFIER, "Expected variable");
|
EXPECT(TOKEN_IDENTIFIER, "Expected variable");
|
||||||
int ivar = get_variable_index(tkn_get_string());
|
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() {
|
/*static void parse_goto() {
|
||||||
emmit(OP_JMP);
|
emmit(OP_JMP);
|
||||||
EXPECT(TOKEN_IDENTIFIER, "Expected label name");
|
EXPECT(TOKEN_IDENTIFIER, "Expected label name");
|
||||||
@@ -690,12 +706,12 @@ static void parse_gosub() {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
static void parse_return() {
|
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);
|
emmit(OP_RET);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// [RZC 27/04/2021] No hi ha labels
|
// XXX [RZC 27/04/2021] No hi ha labels
|
||||||
/*static void parse_label() {
|
/*static void parse_label() {
|
||||||
register_label_address(tkn_get_string());
|
register_label_address(tkn_get_string());
|
||||||
tkn_next();
|
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() {
|
/*static void include_labels() {
|
||||||
FILE *f = fopen("rom.lbl", "rb");
|
FILE *f = fopen("rom.lbl", "rb");
|
||||||
byte num_labels;
|
byte num_labels;
|
||||||
@@ -815,13 +831,13 @@ void parser_parse(const char* buffer, byte* mem) {
|
|||||||
parser_finished = false;
|
parser_finished = false;
|
||||||
//include_labels();
|
//include_labels();
|
||||||
code = mem;
|
code = mem;
|
||||||
codepos = 2; // [RZC 27/04/2021] [TODO] Perquè 2?
|
codepos = 2; // XXX [RZC 27/04/2021] Perquè 2?
|
||||||
tkn_next();
|
tkn_next();
|
||||||
|
|
||||||
parse_global_statements();
|
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);
|
error_print(NULL);
|
||||||
//codepos = 0xA000;
|
//codepos = 0xA000;
|
||||||
//emmit(OP_JMP);
|
//emmit(OP_JMP);
|
||||||
|
|||||||
8
test.vb
8
test.vb
@@ -4,5 +4,11 @@ struct point
|
|||||||
y as number
|
y as number
|
||||||
end
|
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
|
const perico as number = 4-peiv
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
struct t_struct {
|
struct t_struct {
|
||||||
std::string name;
|
std::string name;
|
||||||
int size;
|
uint32_t size;
|
||||||
std::vector<t_variable> members;
|
std::vector<t_variable> members;
|
||||||
};
|
};
|
||||||
static std::vector<t_struct> types;
|
static std::vector<t_struct> types;
|
||||||
@@ -17,7 +17,7 @@ void types_init() {
|
|||||||
|
|
||||||
const int types_add(const std::string name) {
|
const int types_add(const std::string name) {
|
||||||
for (auto t : types) if (t.name == name) return -1;
|
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);
|
types.push_back(new_type);
|
||||||
return types.size()-1;
|
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) {
|
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
|
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;
|
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].members.push_back(new_var);
|
||||||
types[type].size += types_get_length(var_type) + length;
|
types[type].size += types_get_length(var_type) + length;
|
||||||
return types[type].members.size()-1;
|
return types[type].members.size()-1;
|
||||||
|
|||||||
Reference in New Issue
Block a user