closer to getting func def working
This commit is contained in:
11
src/lexer.h
11
src/lexer.h
@@ -29,7 +29,9 @@ typedef enum {
|
|||||||
TOKEN_SEMI,
|
TOKEN_SEMI,
|
||||||
TOKEN_FN,
|
TOKEN_FN,
|
||||||
TOKEN_LET,
|
TOKEN_LET,
|
||||||
TOKEN_IDENT_INT //TODO: unhardcode
|
TOKEN_IDENT_INT, //TODO: unhardcode
|
||||||
|
TOKEN_EQU,
|
||||||
|
TOKEN_RETURN
|
||||||
} symbols;
|
} symbols;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -67,7 +69,10 @@ char *token_type_to_string(symbols type) {
|
|||||||
case TOKEN_FN: return "TOKEN_FN";
|
case TOKEN_FN: return "TOKEN_FN";
|
||||||
case TOKEN_LET: return "TOKEN_LET";
|
case TOKEN_LET: return "TOKEN_LET";
|
||||||
case TOKEN_IDENT_INT: return "TOKEN_IDENT_INT";
|
case TOKEN_IDENT_INT: return "TOKEN_IDENT_INT";
|
||||||
default: return "UNKNOWN_SYMBOL";
|
case TOKEN_EQU: return "TOKEN_EQU";
|
||||||
|
case TOKEN_RETURN: return "TOKEN_RETURN";
|
||||||
|
|
||||||
|
// default: return "UNKNOWN_SYMBOL";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,6 +201,7 @@ size_t read_from_tok(Token *tok, const char *input, size_t cursor) {
|
|||||||
|
|
||||||
if (strcmp(buf, "let") == 0) token_push(tok, TOKEN_LET, buf, BHV_UNDEFINED, cursor - start);
|
if (strcmp(buf, "let") == 0) token_push(tok, TOKEN_LET, buf, BHV_UNDEFINED, cursor - start);
|
||||||
else if (strcmp(buf, "fn") == 0) token_push(tok, TOKEN_FN, buf, BHV_UNDEFINED, cursor - start);
|
else if (strcmp(buf, "fn") == 0) token_push(tok, TOKEN_FN, buf, BHV_UNDEFINED, cursor - start);
|
||||||
|
else if (strcmp(buf, "return") == 0) token_push(tok, TOKEN_RETURN, buf, BHV_UNDEFINED, cursor - start);
|
||||||
else if (strcmp(buf, "int") == 0) token_push(tok, TOKEN_IDENT_INT, buf, BHV_UNDEFINED, cursor - start); // TODO: unhardcode
|
else if (strcmp(buf, "int") == 0) token_push(tok, TOKEN_IDENT_INT, buf, BHV_UNDEFINED, cursor - start); // TODO: unhardcode
|
||||||
else token_push(tok, TOKEN_IDENTIFIER, buf, BHV_IDENT, cursor - start);
|
else token_push(tok, TOKEN_IDENTIFIER, buf, BHV_IDENT, cursor - start);
|
||||||
|
|
||||||
@@ -212,6 +218,7 @@ size_t read_from_tok(Token *tok, const char *input, size_t cursor) {
|
|||||||
case '}': token_push(tok, TOKEN_RCURLY, "}", BHV_STACK, 1); break;
|
case '}': token_push(tok, TOKEN_RCURLY, "}", BHV_STACK, 1); break;
|
||||||
case ';': token_push(tok, TOKEN_SEMI, ";", BHV_STACK, 1); break;
|
case ';': token_push(tok, TOKEN_SEMI, ";", BHV_STACK, 1); break;
|
||||||
case ':': token_push(tok, TOKEN_COLON, ":", BHV_STACK, 1); break;
|
case ':': token_push(tok, TOKEN_COLON, ":", BHV_STACK, 1); break;
|
||||||
|
case '=': token_push(tok, TOKEN_EQU, "=", BHV_STACK, 1); break;
|
||||||
|
|
||||||
case '(':
|
case '(':
|
||||||
token_push(tok, TOKEN_LPAREN, "(", BHV_STACK, 1);
|
token_push(tok, TOKEN_LPAREN, "(", BHV_STACK, 1);
|
||||||
|
|||||||
90
src/parser.h
90
src/parser.h
@@ -201,6 +201,88 @@ void skip_space(Token *inp, size_t *idx){
|
|||||||
while (inp->type[*idx] == TOKEN_SPACE || inp->type[*idx] == TOKEN_NEWLINE) (*idx)++;
|
while (inp->type[*idx] == TOKEN_SPACE || inp->type[*idx] == TOKEN_NEWLINE) (*idx)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Token slice_token(Token *inp, size_t a, size_t z){ // probably should be implemented in lexer but not bothered
|
||||||
|
Token t = {0};
|
||||||
|
token_init(&t, z-a+1);
|
||||||
|
for (size_t i=a; i<z; ++i){
|
||||||
|
token_push(&t, inp->type[i], inp->text[i], inp->behaviour[i], inp->cursor_skip[i]);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
Token parse_statement(Token *inp, size_t *idx, SymbolTable *sym){
|
||||||
|
skip_space(inp, idx);
|
||||||
|
|
||||||
|
if (inp->type[*idx] == TOKEN_LET){
|
||||||
|
(*idx)++;
|
||||||
|
skip_space(inp, idx);
|
||||||
|
|
||||||
|
if (inp->type[*idx] != TOKEN_IDENTIFIER){
|
||||||
|
fprintf(stderr, "Expected Identifier after 'let'");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *var_name = inp->text[*idx];
|
||||||
|
(*idx)++;
|
||||||
|
skip_space(inp, idx);
|
||||||
|
|
||||||
|
if (inp->type[*idx] != TOKEN_EQU){
|
||||||
|
fprintf(stderr, "Expected '=' after identifier");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
(*idx)++;
|
||||||
|
skip_space(inp, idx);
|
||||||
|
|
||||||
|
size_t expr_start = *idx;
|
||||||
|
while (inp->type[*idx] != TOKEN_SEMI && inp->type[*idx] != TOKEN_EOF){
|
||||||
|
(*idx)++;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t expr_end = *idx;
|
||||||
|
Token expr = slice_token(inp, expr_start, expr_end);
|
||||||
|
Token rpn = build_rpn(&expr, sym);
|
||||||
|
|
||||||
|
|
||||||
|
Symbol exprn =
|
||||||
|
{
|
||||||
|
.name=strdup(var_name),
|
||||||
|
.symbol_kind = SYM_VAR,
|
||||||
|
.builtin = false,
|
||||||
|
.ret_type = TOKEN_UNKNOWN
|
||||||
|
};
|
||||||
|
symbol_table_add(sym, exprn);
|
||||||
|
|
||||||
|
skip_space(inp, idx);
|
||||||
|
if (inp->type[*idx] == TOKEN_SEMI) {
|
||||||
|
(*idx)++;
|
||||||
|
skip_space(inp, idx);
|
||||||
|
return rpn;
|
||||||
|
}
|
||||||
|
} else if (inp->type[*idx] == TOKEN_RETURN) {
|
||||||
|
(*idx)++;
|
||||||
|
skip_space(inp, idx);
|
||||||
|
|
||||||
|
size_t expr_start = *idx;
|
||||||
|
while (inp->type[*idx] != TOKEN_SEMI && inp->type[*idx] != TOKEN_EOF){
|
||||||
|
(*idx)++;
|
||||||
|
}
|
||||||
|
size_t expr_end = *idx;
|
||||||
|
|
||||||
|
Token expr = slice_token(inp, expr_start, expr_end);
|
||||||
|
Token rpn = build_rpn(&expr, sym);
|
||||||
|
(*idx)++;
|
||||||
|
if (inp->type[*idx] == TOKEN_SEMI) {
|
||||||
|
(*idx)++;
|
||||||
|
skip_space(inp, idx);
|
||||||
|
return rpn;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Unexpected statement '%s\n'", inp->text[*idx]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Token parse_func_def(Token *inp, size_t *idx, SymbolTable *sym) {
|
Token parse_func_def(Token *inp, size_t *idx, SymbolTable *sym) {
|
||||||
skip_space(inp, idx);
|
skip_space(inp, idx);
|
||||||
if (inp->type[*idx] != TOKEN_FN) {
|
if (inp->type[*idx] != TOKEN_FN) {
|
||||||
@@ -291,8 +373,11 @@ Token parse_func_def(Token *inp, size_t *idx, SymbolTable *sym) {
|
|||||||
(*idx)++;
|
(*idx)++;
|
||||||
skip_space(inp, idx);
|
skip_space(inp, idx);
|
||||||
|
|
||||||
|
Token statement = {0};
|
||||||
|
|
||||||
while (inp->type[*idx] != TOKEN_RCURLY && inp->type[*idx] != TOKEN_EOF) {
|
while (inp->type[*idx] != TOKEN_RCURLY && inp->type[*idx] != TOKEN_EOF) {
|
||||||
(*idx)++;
|
statement = parse_statement(inp, idx, sym);
|
||||||
|
skip_space(inp, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inp->type[*idx] != TOKEN_RCURLY) {
|
if (inp->type[*idx] != TOKEN_RCURLY) {
|
||||||
@@ -302,8 +387,7 @@ Token parse_func_def(Token *inp, size_t *idx, SymbolTable *sym) {
|
|||||||
|
|
||||||
(*idx)++;
|
(*idx)++;
|
||||||
symbol_table_add(sym, func);
|
symbol_table_add(sym, func);
|
||||||
Token empty = {0};
|
return statement; // TODO: return block aka multiple statements
|
||||||
return empty;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user