lexer, parser: pass around lua version
This commit is contained in:
@@ -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') {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
8
src/noom.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
typedef enum noom_LuaVersion {
|
||||||
|
NOOM_VERSION_51,
|
||||||
|
NOOM_VERSION_52,
|
||||||
|
NOOM_VERSION_53,
|
||||||
|
NOOM_VERSION_54
|
||||||
|
} noom_LuaVersion;
|
||||||
|
|
||||||
|
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user