[BUG] Disallow decimals on array decl and indices

[FEAT] Parser checks index out of bounds errors
This commit is contained in:
2021-05-04 16:29:37 +02:00
parent 28b059c57e
commit 7297215aeb
3 changed files with 11 additions and 37 deletions

View File

@@ -289,7 +289,9 @@ static int get_variable_address() {
if (var_length > 1) {
tkn_next(); EXPECT2(TOKEN_LBRACKET, "Expected '['");
tkn_next(); EXPECT2(TOKEN_NUMBER, "Expected number");
const float index = tkn_get_value();
const int index = (int)tkn_get_value();
if (tkn_get_value() > index) HALT2("Expected integer value");
if (index >= var_length) HALT2("Index out of bounds");
tkn_next(); EXPECT2(TOKEN_RBRACKET, "Expected ']'");
address += index * types_get_length(var_type);
}
@@ -330,28 +332,6 @@ static void parse_expr_atom() {
parser_finished = true; error_raise("Unknown identifier");
return;
}
// XXX [RZC 27/04/2021] Per ara llevem les constants
/*int constvalue = get_constant(tkn_get_string());
if (constvalue != -1) {
emmit(OP_PUSH);
emmit(constvalue);
tkn_next();
return;
}*/
// 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");
tkn_next(); parse_expr_atom();
EXPECT(TOKEN_RPAR, "Expected ')'");
emmit(OP_SETY);
emmit(OP_LOADI);
emmit_w(ivar);
} else {
emmit(OP_LOAD);
emmit_w(ivar);
}*/
}
if (tkn_get_token() == TOKEN_MINUS) {
tkn_next();
@@ -372,14 +352,6 @@ static void parse_expr_atom() {
tkn_next();
return;
}
// 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; }
if (tkn_get_token() == TOKEN_ANYKEY) { tkn_next(); parse_anykey(); return; }
if (tkn_get_token() == TOKEN_GETCHAR) { tkn_next(); parse_getchar(); return; }
if (tkn_get_token() == TOKEN_GETCOLOR) { tkn_next(); parse_getcolor(); return; }
*/
parser_finished = true; error_raise("Syntax error");
return;
}
@@ -465,7 +437,6 @@ static void parse_const() {
const int var_address = scope_declare_variable(const_name, type_num, 0);
emmit(scope_is_local() ? OP_STL : OP_ST);
emmit_dw(var_address);
//tkn_next();
}
static void parse_var() {
@@ -477,8 +448,10 @@ 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"); // TODO [RZC 04/05/2021] Només deuria acceptar enters.
var_length = tkn_get_value();
tkn_next(); EXPECT(TOKEN_NUMBER, "Expected number");
const float length = tkn_get_value();
var_length = (int)length;
if (length > var_length) HALT("Expected integer value");
tkn_next();
}
EXPECT(TOKEN_IDENTIFIER, "Expected type identifier");