diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index f0d8e21..650d144 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -74,6 +74,9 @@ struct LexerResult runLexer(char* string) { if(strcmp(buff, "func") == 0) { pushToken(&result, FUNCTION); } + else if(strcmp(buff, "asmf") == 0) { + pushToken(&result, ASM_FUNCTION); + } else if(strcmp(buff, "true") == 0 || strcmp(buff, "false") == 0) { pushToken(&result, BOOLEAN_VALUE); result.tokens[result.size - 1].value = buff; diff --git a/src/lexer/tokens.h b/src/lexer/tokens.h index a5b7ece..2e99cee 100644 --- a/src/lexer/tokens.h +++ b/src/lexer/tokens.h @@ -2,6 +2,7 @@ #define TOKENS_H enum TokenType { + ASM_FUNCTION, FUNCTION, RETURN, VAR, diff --git a/src/parser/ast.h b/src/parser/ast.h index 5df85bd..3416964 100644 --- a/src/parser/ast.h +++ b/src/parser/ast.h @@ -19,6 +19,8 @@ enum ASTNodeType { AST_VARIABLE_DECLARATION, AST_VARIABLE_REFERENCE, + AST_ASM_FUNCTION_DECLARATION, + AST_FUNCTION_DECLARATION, AST_FUNCTION_HEADER, diff --git a/src/parser/asts/functions.c b/src/parser/asts/functions.c index 95cb6b8..e9e0fb9 100644 --- a/src/parser/asts/functions.c +++ b/src/parser/asts/functions.c @@ -2,6 +2,8 @@ * Function-related AST parsing. */ +#include + #include "./variables.h" #include "../parser.h" @@ -10,6 +12,8 @@ #include "../../lexer/tokens.h" #include "../../lexer/lexer.h" +#include "../../utils/logging.c" + /** * Parse the parameters from a function definition (for example). * @param result the lexer result. @@ -138,3 +142,53 @@ AST_NODE* parseFunctionDeclaration(struct LexerResult result, int index) { return node; } + +AST_NODE* parseASMFunctionDeclaration(struct LexerResult result, int index) { + AST_NODE* node = createASTNode(AST_ASM_FUNCTION_DECLARATION); + + node->left = createASTNode(AST_FUNCTION_HEADER); + + if(result.tokens[index].type != KEYWORD) { + return NULL; + } + + AST_NODE* params = parseParameters(result, index + 1); + + if(params == NULL) return NULL; + + node->left->left = params; + + index = params->endingIndex; + + int buffSize = 32; + int buffIndex = 0; + char* buff = malloc(buffSize); + + for(; index <= result.size; ++index) { + struct Token t = result.tokens[index]; + + if(t.type == BRACKETS_CLOSE) { + break; + } + + if(t.type != STRING) { + return NULL; + } + + char c; + while(c = *t.value++) { + buff[buffIndex] = c; + buffIndex++; + + if(buffIndex >= buffSize) { + buffSize *= 1.5; + buff = realloc(buff, buffSize); + } + } + } + + buff[buffIndex] = '\0'; + + node->value = buff; + return node; +} diff --git a/src/parser/asts/functions.h b/src/parser/asts/functions.h index cf05a1b..025f43e 100644 --- a/src/parser/asts/functions.h +++ b/src/parser/asts/functions.h @@ -30,4 +30,11 @@ AST_NODE* parseArguments(struct LexerResult result, int index); */ AST_NODE* parseFunctionDeclaration(struct LexerResult result, int index); +/** + * Parses an ASM function declaration. + * @param result the lexer result. + * @param index the starting index of the parsing. + */ +AST_NODE* parseASMFunctionDeclaration(struct LexerResult result, int index); + #endif diff --git a/src/parser/parser.c b/src/parser/parser.c index 6fce88c..15bada7 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -44,7 +44,15 @@ AST_NODE* parseNodes(struct LexerResult result, int index, enum ASTNodeType type index = node->endingIndex; } break; - + case ASM_FUNCTION: + node = parseASMFunctionDeclaration(result, index); + if(node != NULL) { + current->next = node; + current = node; + index = node->endingIndex; + } + break; + } }