Added pushing tokens to the stack
This commit is contained in:
parent
0bbb43d5a3
commit
ffc73e773c
|
|
@ -45,7 +45,7 @@ typedef struct StackItem {
|
||||||
uint8_t u8;
|
uint8_t u8;
|
||||||
float f32;
|
float f32;
|
||||||
double f64;
|
double f64;
|
||||||
char character;
|
uint8_t character;
|
||||||
Boolean boolean;
|
Boolean boolean;
|
||||||
TokenString token_string;
|
TokenString token_string;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,113 @@ static TokenString *hash_table_get_funcs(const HashTable *ht, SlsStr key, TokenS
|
||||||
}
|
}
|
||||||
|
|
||||||
static Boolean push_token(InterpreterState *interpreter_state, Token token) {
|
static Boolean push_token(InterpreterState *interpreter_state, Token token) {
|
||||||
|
StackType type;
|
||||||
|
switch (token.type) {
|
||||||
|
case TOKEN_EOF:
|
||||||
|
return TRUE;
|
||||||
|
case TOKEN_IDENTIFIER:
|
||||||
|
type = STACK_IDENTIFIER;
|
||||||
|
break;
|
||||||
|
case TOKEN_INTEGER:
|
||||||
|
switch (token.integer_literal.type) {
|
||||||
|
case INTEGER_I64:
|
||||||
|
type = STACK_I64;
|
||||||
|
break;
|
||||||
|
case INTEGER_I32:
|
||||||
|
type = STACK_I32;
|
||||||
|
break;
|
||||||
|
case INTEGER_I16:
|
||||||
|
type = STACK_I16;
|
||||||
|
break;
|
||||||
|
case INTEGER_I8:
|
||||||
|
type = STACK_I8;
|
||||||
|
break;
|
||||||
|
case INTEGER_U64:
|
||||||
|
type = STACK_U64;
|
||||||
|
break;
|
||||||
|
case INTEGER_U32:
|
||||||
|
type = STACK_U32;
|
||||||
|
break;
|
||||||
|
case INTEGER_U16:
|
||||||
|
type = STACK_U16;
|
||||||
|
break;
|
||||||
|
case INTEGER_U8:
|
||||||
|
type = STACK_U8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TOKEN_FLOAT:
|
||||||
|
type = STACK_FLOAT;
|
||||||
|
break;
|
||||||
|
case TOKEN_DOUBLE:
|
||||||
|
type = STACK_DOUBLE;
|
||||||
|
break;
|
||||||
|
case TOKEN_CHARACTER:
|
||||||
|
type = STACK_CHARACTER;
|
||||||
|
break;
|
||||||
|
case TOKEN_STRING:
|
||||||
|
return FALSE;
|
||||||
|
case TOKEN_BOOLEAN:
|
||||||
|
type = STACK_BOOLEAN;
|
||||||
|
break;
|
||||||
|
case TOKEN_ARRAY:
|
||||||
|
return FALSE;
|
||||||
|
case TOKEN_TOKEN_STRING:
|
||||||
|
type = STACK_TOKEN_STRING;
|
||||||
|
break;
|
||||||
|
case TOKEN_TYPE_TUPLE:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
StackItem *item = (StackItem *)malloc(sizeof(StackItem));
|
||||||
|
item->type = type;
|
||||||
|
item->next = interpreter_state->stack;
|
||||||
|
interpreter_state->stack = item;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case STACK_IDENTIFIER:
|
||||||
|
item->identifier = token.identifier;
|
||||||
|
break;
|
||||||
|
case STACK_I64:
|
||||||
|
item->i64 = (int64_t)token.integer_literal.value;
|
||||||
|
break;
|
||||||
|
case STACK_I32:
|
||||||
|
item->i32 = (int32_t)token.integer_literal.value;
|
||||||
|
break;
|
||||||
|
case STACK_I16:
|
||||||
|
item->i16 = (int16_t)token.integer_literal.value;
|
||||||
|
break;
|
||||||
|
case STACK_I8:
|
||||||
|
item->i8 = (int8_t)token.integer_literal.value;
|
||||||
|
break;
|
||||||
|
case STACK_U64:
|
||||||
|
item->u64 = (uint64_t)token.integer_literal.value;
|
||||||
|
break;
|
||||||
|
case STACK_U32:
|
||||||
|
item->u32 = (uint32_t)token.integer_literal.value;
|
||||||
|
break;
|
||||||
|
case STACK_U16:
|
||||||
|
item->u16 = (uint16_t)token.integer_literal.value;
|
||||||
|
break;
|
||||||
|
case STACK_U8:
|
||||||
|
item->u8 = (uint8_t)token.integer_literal.value;
|
||||||
|
break;
|
||||||
|
case STACK_FLOAT:
|
||||||
|
item->f32 = token.float_literal;
|
||||||
|
break;
|
||||||
|
case STACK_DOUBLE:
|
||||||
|
item->f64 = token.double_literal;
|
||||||
|
break;
|
||||||
|
case STACK_CHARACTER:
|
||||||
|
item->character = token.character_literal;
|
||||||
|
break;
|
||||||
|
case STACK_BOOLEAN:
|
||||||
|
item->boolean = token.boolean_literal;
|
||||||
|
break;
|
||||||
|
case STACK_TOKEN_STRING:
|
||||||
|
item->token_string = copy_token_string(token.token_string);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Boolean execute_func(InterpreterState *interpreter_state, SlsStr key) {
|
static Boolean execute_func(InterpreterState *interpreter_state, SlsStr key) {
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ int repl(int argc, char *argv[]) {
|
||||||
LexerInfo lexer_info;
|
LexerInfo lexer_info;
|
||||||
InterpreterState *interpreter_state = interpreter_create();
|
InterpreterState *interpreter_state = interpreter_create();
|
||||||
char buf[256];
|
char buf[256];
|
||||||
while (fgets(buf, sizeof buf, stdin)) {
|
while (fgets(buf, sizeof(buf), stdin)) {
|
||||||
size_t len = strlen(buf);
|
size_t len = strlen(buf);
|
||||||
if (len && buf[len - 1] == '\n') buf[len - 1] = '\0';
|
if (len && buf[len - 1] == '\n') buf[len - 1] = '\0';
|
||||||
if (strncmp(buf, "#exit", 5) == 0) {
|
if (strncmp(buf, "#exit", 5) == 0) {
|
||||||
|
|
@ -36,7 +36,7 @@ int repl(int argc, char *argv[]) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SlsStr code = sls_str_malloc(buf, sizeof buf);
|
SlsStr code = sls_str_malloc(buf, sizeof(buf));
|
||||||
init_lexer(&lexer_info, REPL_FILE_NAME, code);
|
init_lexer(&lexer_info, REPL_FILE_NAME, code);
|
||||||
LexerResult result = lexical_analysis(&lexer_info);
|
LexerResult result = lexical_analysis(&lexer_info);
|
||||||
if (result.type == SLS_ERROR) {
|
if (result.type == SLS_ERROR) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue