[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");

View File

@@ -11,4 +11,4 @@ struct triangle
end
var peiv as array of 2 triangle
const perico as number = 4-peiv[0].a.x
const perico as number = 4-peiv[1].a.x

View File

@@ -1,5 +1,6 @@
#include "tokenizer.h"
#include "error.h"
#include <string>
static bool streq(const char* a, const char* b) {
while (*a != 0 && *b != 0) {
@@ -79,8 +80,8 @@ static void tkn_do_next() {
if (CCHR >= 48 && CCHR <= 57) {
do { value = value * 10 + (CCHR - 48); NEXT; } while (CCHR >= 48 && CCHR <= 57);
if (CCHR == '.') {
int d = 10;
do { value = value + ((CCHR - 48) / d); d *= 10; NEXT; } while (CCHR >= 48 && CCHR <= 57);
float d = 0.1f; NEXT;
do { value = value + (float(CCHR - 48) * d); d *= 0.1f; NEXT; } while (CCHR >= 48 && CCHR <= 57);
}
current_token = TOKEN_NUMBER; return;
}