lexer, parser: pass around lua version

This commit is contained in:
2026-04-19 17:07:05 +02:00
parent 92b85584c1
commit 1807520170
6 changed files with 23 additions and 11 deletions

View File

@@ -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; const char* str = s + start;
if (str[0] == '\0') { if (str[0] == '\0') {

View File

@@ -1,4 +1,5 @@
#include "types.h" #include "types.h"
#include "noom.h"
typedef enum noomL_TokenType { typedef enum noomL_TokenType {
NOOML_TOKEN_EOF = 0, NOOML_TOKEN_EOF = 0,
@@ -34,5 +35,5 @@ noom_uint_t noomL_getnumber(const char* s);
const char *noomL_formatTokenType(noomL_TokenType token_type); 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

View File

@@ -33,14 +33,14 @@ void print_node(noomP_Node* node, noom_uint_t depth) {
int main(int argc, char** argv) { int main(int argc, char** argv) {
// uhh uhhh uhhhhh // 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; noom_uint_t pos = 0;
printf("LEX OUTPUT:\n"); printf("LEX OUTPUT:\n");
noomL_Token token; noomL_Token token;
while (1) { while (1) {
noomL_lex(code, pos, &token); noomL_lex(code, pos, &token, NOOM_VERSION_51);
printf("%s ", noomL_formatTokenType(token.type)); printf("%s ", noomL_formatTokenType(token.type));
for (noom_uint_t i = 0; i < token.length; i++) putchar((code + token.offset)[i]); 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 *program;
noomP_Node *last_node; 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; if (success != 0) return success;
print_node(program, 0); print_node(program, 0);

8
src/noom.h Normal file
View File

@@ -0,0 +1,8 @@
typedef enum noom_LuaVersion {
NOOM_VERSION_51,
NOOM_VERSION_52,
NOOM_VERSION_53,
NOOM_VERSION_54
} noom_LuaVersion;

View File

@@ -36,7 +36,7 @@ const char *noomP_formatNodeType(noomP_NodeType node_type) {
int noomP_peek(noomP_Parser* parser, noomL_Token* token) { int noomP_peek(noomP_Parser* parser, noomL_Token* token) {
while (1) { 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 (success != 0) return -1; // TODO: proper error propogation and stuff
if (token->type == NOOML_TOKEN_WHITESPACE) { if (token->type == NOOML_TOKEN_WHITESPACE) {
@@ -578,9 +578,9 @@ noomP_Node* noomP_parseStatement(noomP_Parser* parser) {
return stmt; 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_Parser parser;
noomP_initParser(&parser, code, filename); noomP_initParser(&parser, code, filename, version);
noomL_Token token; noomL_Token token;
noomP_Node* node = noomP_allocNode(&parser); noomP_Node* node = noomP_allocNode(&parser);
@@ -605,11 +605,12 @@ int noomP_parse(const char* code, const char* filename, noomP_Node** outpointer,
return 0; 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->code = code;
parser->filename = filename; parser->filename = filename;
parser->lex_offset = 0; parser->lex_offset = 0;
parser->last_node = (void *)0; parser->last_node = (void *)0;
parser->version = version;
return 0; return 0;
} }

View File

@@ -37,6 +37,8 @@ typedef struct noomP_Node {
} noomP_Node; } noomP_Node;
typedef struct noomP_Parser { // todo: track location in code with line/column? typedef struct noomP_Parser { // todo: track location in code with line/column?
noom_LuaVersion version;
const char* code; const char* code;
const char* filename; const char* filename;
noom_uint_t lex_offset; 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_parseStatement(noomP_Parser* parser);
noomP_Node* noomP_parseExpression(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);