[BUG] Repaired types on some parameters.
[FEAT] Implemented struct, still testing. [FEAT] Implemented var, still testing.
This commit is contained in:
74
parser.cpp
74
parser.cpp
@@ -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 JailScript
|
||||
/* [RZC 27/04/2021] No usat en JailBasic
|
||||
//static void parse_strleft();
|
||||
static void parse_str();
|
||||
static void parse_chr();
|
||||
@@ -339,7 +339,7 @@ static void parse_expr_atom() {
|
||||
tkn_next();
|
||||
return;
|
||||
}
|
||||
// [RZC 27/04/2021] No usat en JailScript, pero hi haurà que afegir les funcions
|
||||
// [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; }
|
||||
@@ -409,17 +409,24 @@ static void parse_expression() {
|
||||
}
|
||||
}
|
||||
|
||||
static bool identifier_exists(const std::string identifier) {
|
||||
if (scope_variable_exists(identifier)) return true;
|
||||
if (types_exist(identifier) != -1) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void parse_const() {
|
||||
EXPECT(TOKEN_IDENTIFIER, "Expected identifier");
|
||||
char const_name[40];
|
||||
strcpy(const_name, tkn_get_string());
|
||||
if (scope_variable_exists(const_name)) HALT("Identifier already exists");
|
||||
if (identifier_exists(const_name)) HALT("Identifier already exists");
|
||||
tkn_next(); EXPECT(TOKEN_AS, "Expected 'as'");
|
||||
tkn_next(); EXPECT(TOKEN_IDENTIFIER, "Expected type identifier");
|
||||
char type_name[40];
|
||||
strcpy(type_name, tkn_get_string());
|
||||
const int type_num = types_exist(type_name);
|
||||
if (type_num == -1) HALT("Unknown type");
|
||||
if (type_num >= 2) HALT("Only 'number' or 'string' constants allowed");
|
||||
tkn_next(); EXPECT(TOKEN_EQ, "Expected '='");
|
||||
tkn_next(); parse_expression();
|
||||
const int var_address = scope_declare_variable(const_name, type_num, 0);
|
||||
@@ -428,6 +435,61 @@ static void parse_const() {
|
||||
//tkn_next();
|
||||
}
|
||||
|
||||
static void parse_var() {
|
||||
int var_length = 1;
|
||||
EXPECT(TOKEN_IDENTIFIER, "Expected identifier");
|
||||
const std::string var_name = tkn_get_string();
|
||||
if (identifier_exists(var_name)) HALT("Identifier already exists");
|
||||
tkn_next(); EXPECT(TOKEN_AS, "Expected 'as'");
|
||||
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.
|
||||
var_length = tkn_get_value();
|
||||
tkn_next();
|
||||
}
|
||||
EXPECT(TOKEN_IDENTIFIER, "Expected type identifier");
|
||||
const std::string type_name = tkn_get_string();
|
||||
const int type_num = types_exist(type_name);
|
||||
if (type_num == -1) HALT("Unknown type");
|
||||
tkn_next();
|
||||
if (tkn_get_token() == TOKEN_EQ) {
|
||||
if (type_num >= 2) HALT("Only 'number' or 'string' variables can be initialized on declaration")
|
||||
if (var_length > 1) HALT("Array variables cannot be initialized on declaration")
|
||||
tkn_next(); parse_expression();
|
||||
const int var_address = scope_declare_variable(var_name, type_num, var_length);
|
||||
emmit(scope_is_local() ? OP_STL : OP_ST);
|
||||
emmit_dw(var_address);
|
||||
} else {
|
||||
scope_declare_variable(var_name, type_num, var_length);
|
||||
//tkn_next();
|
||||
}
|
||||
}
|
||||
|
||||
static void parse_struct() {
|
||||
EXPECT(TOKEN_IDENTIFIER, "Expected identifier");
|
||||
char struct_name[40];
|
||||
strcpy(struct_name, tkn_get_string());
|
||||
if (identifier_exists(struct_name)) HALT("Identifier already exists");
|
||||
const int struct_num = types_add(struct_name);
|
||||
tkn_next();
|
||||
while (tkn_get_token() != TOKEN_END) {
|
||||
EXPECT(TOKEN_IDENTIFIER, "Expected identifier");
|
||||
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
|
||||
tkn_next(); EXPECT(TOKEN_IDENTIFIER, "Expected type identifier");
|
||||
char type_name[40];
|
||||
strcpy(type_name, tkn_get_string());
|
||||
const int type_num = types_exist(type_name);
|
||||
if (type_num == -1) HALT("Unknown type");
|
||||
types_add_member(struct_num, member_name, type_num, 1);
|
||||
tkn_next();
|
||||
}
|
||||
tkn_next();
|
||||
}
|
||||
|
||||
/*static void parse_dim() {
|
||||
EXPECT(TOKEN_IDENTIFIER, "Expected variable");
|
||||
char varname[40];
|
||||
@@ -706,11 +768,11 @@ static void parse_global_statements() {
|
||||
switch (tkn_get_token()) {
|
||||
case TOKEN_CONST:
|
||||
tkn_next(); parse_const(); break;
|
||||
/*case TOKEN_VAR:
|
||||
case TOKEN_VAR:
|
||||
tkn_next(); parse_var(); break;
|
||||
case TOKEN_STRUCT:
|
||||
tkn_next(); parse_struct(); break;
|
||||
case TOKEN_FUNCTION:
|
||||
/*case TOKEN_FUNCTION:
|
||||
tkn_next(); parse_function(); break;*/
|
||||
case TOKEN_REM:
|
||||
tkn_next(); break;
|
||||
@@ -723,7 +785,7 @@ static void parse_global_statements() {
|
||||
}
|
||||
}
|
||||
|
||||
// [RZC 27/04/2021] No usat en JailScript
|
||||
// [RZC 27/04/2021] No usat en JailBasic
|
||||
/*static void include_labels() {
|
||||
FILE *f = fopen("rom.lbl", "rb");
|
||||
byte num_labels;
|
||||
|
||||
Reference in New Issue
Block a user