diff --git a/src/lexer.c b/src/lexer.c index 2530ab7..080a396 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -128,7 +128,7 @@ const char *noomL_formatTokenType(noomL_TokenType token_type) { } -noomL_ErrorType noomL_lex(const char* s, noom_uint_t start, noomL_Token* token) { +noomL_ErrorType noomL_lex(const char* s, noom_uint_t start, noomL_Token* token, noom_LuaVersion version) { const char* str = s + start; if (str[0] == '\0') { diff --git a/src/lexer.h b/src/lexer.h index 54872eb..76f9d3a 100644 --- a/src/lexer.h +++ b/src/lexer.h @@ -1,4 +1,5 @@ #include "types.h" +#include "noom.h" typedef enum noomL_TokenType { NOOML_TOKEN_EOF = 0, @@ -34,5 +35,5 @@ noom_uint_t noomL_getnumber(const char* s); const char *noomL_formatTokenType(noomL_TokenType token_type); -noomL_ErrorType noomL_lex(const char* s, noom_uint_t start, noomL_Token* token); // TODO: add more error data +noomL_ErrorType noomL_lex(const char* s, noom_uint_t start, noomL_Token* token, noom_LuaVersion version); // TODO: add more error data diff --git a/src/main.c b/src/main.c index 7645fa1..b6b03b4 100644 --- a/src/main.c +++ b/src/main.c @@ -33,14 +33,14 @@ void print_node(noomP_Node* node, noom_uint_t depth) { int main(int argc, char** argv) { // uhh uhhh uhhhhh - const char* code = "local a, b"; + const char* code = "local a, b = true, false\nif a == b then elseif a or b then end"; noom_uint_t pos = 0; printf("LEX OUTPUT:\n"); noomL_Token token; while (1) { - noomL_lex(code, pos, &token); + noomL_lex(code, pos, &token, NOOM_VERSION_51); printf("%s ", noomL_formatTokenType(token.type)); for (noom_uint_t i = 0; i < token.length; i++) putchar((code + token.offset)[i]); @@ -57,7 +57,7 @@ int main(int argc, char** argv) { noomP_Node *program; noomP_Node *last_node; - int success = noomP_parse(code, "shitass", &program, &last_node); + int success = noomP_parse(code, "shitass", NOOM_VERSION_54, &program, &last_node); if (success != 0) return success; print_node(program, 0); diff --git a/src/noom.h b/src/noom.h new file mode 100644 index 0000000..98e0eb9 --- /dev/null +++ b/src/noom.h @@ -0,0 +1,8 @@ +typedef enum noom_LuaVersion { + NOOM_VERSION_51, + NOOM_VERSION_52, + NOOM_VERSION_53, + NOOM_VERSION_54 +} noom_LuaVersion; + + diff --git a/src/parser.c b/src/parser.c index 05298ee..dbfeb42 100644 --- a/src/parser.c +++ b/src/parser.c @@ -36,7 +36,7 @@ const char *noomP_formatNodeType(noomP_NodeType node_type) { int noomP_peek(noomP_Parser* parser, noomL_Token* token) { while (1) { - int success = noomL_lex(parser->code, parser->lex_offset, token); + int success = noomL_lex(parser->code, parser->lex_offset, token, parser->version); if (success != 0) return -1; // TODO: proper error propogation and stuff if (token->type == NOOML_TOKEN_WHITESPACE) { @@ -578,9 +578,9 @@ noomP_Node* noomP_parseStatement(noomP_Parser* parser) { return stmt; } -int noomP_parse(const char* code, const char* filename, noomP_Node** outpointer, noomP_Node** last_node) { +int noomP_parse(const char* code, const char* filename, noom_LuaVersion version, noomP_Node** outpointer, noomP_Node** last_node) { noomP_Parser parser; - noomP_initParser(&parser, code, filename); + noomP_initParser(&parser, code, filename, version); noomL_Token token; noomP_Node* node = noomP_allocNode(&parser); @@ -605,11 +605,12 @@ int noomP_parse(const char* code, const char* filename, noomP_Node** outpointer, return 0; } -int noomP_initParser(noomP_Parser* parser, const char* code, const char* filename) { +int noomP_initParser(noomP_Parser* parser, const char* code, const char* filename, noom_LuaVersion version) { parser->code = code; parser->filename = filename; parser->lex_offset = 0; parser->last_node = (void *)0; + parser->version = version; return 0; } diff --git a/src/parser.h b/src/parser.h index 118295a..7064e7f 100644 --- a/src/parser.h +++ b/src/parser.h @@ -37,6 +37,8 @@ typedef struct noomP_Node { } noomP_Node; typedef struct noomP_Parser { // todo: track location in code with line/column? + noom_LuaVersion version; + const char* code; const char* filename; noom_uint_t lex_offset; @@ -54,7 +56,7 @@ noomP_Node* noomP_allocNode(noomP_Parser* parser); noomP_Node* noomP_parseStatement(noomP_Parser* parser); noomP_Node* noomP_parseExpression(noomP_Parser* parser); -int noomP_parse(const char* code, const char* filename, noomP_Node** outpointer, noomP_Node** last_node); +int noomP_parse(const char* code, const char* filename, noom_LuaVersion version, noomP_Node** outpointer, noomP_Node** last_node); -int noomP_initParser(noomP_Parser* parser, const char* code, const char* filename); +int noomP_initParser(noomP_Parser* parser, const char* code, const char* filename, noom_LuaVersion version);