diff --git a/include/pocketpy/compiler/compiler.h b/include/pocketpy/compiler/compiler.h new file mode 100644 index 00000000..8622a422 --- /dev/null +++ b/include/pocketpy/compiler/compiler.h @@ -0,0 +1,15 @@ +#pragma once + +#include "pocketpy/common/vector.h" +#include "pocketpy/compiler/lexer.h" + +#ifdef __cplusplus +extern "C" { +#endif + +Error* pk_compile(pk_SourceData_ src); + + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/include/pocketpy/compiler/lexer.h b/include/pocketpy/compiler/lexer.h index 36b8bfcd..ceeca13d 100644 --- a/include/pocketpy/compiler/lexer.h +++ b/include/pocketpy/compiler/lexer.h @@ -35,8 +35,15 @@ typedef enum TokenIndex{ TK__COUNT__ } TokenIndex; +enum TokenValueIndex{ + TokenValue_EMPTY = 0, + TokenValue_I64 = 1, + TokenValue_F64 = 2, + TokenValue_STR = 3, +}; + typedef struct TokenValue { - int index; // 0: empty + enum TokenValueIndex index; // 0: empty union { int64_t _i64; // 1 double _f64; // 2 @@ -44,11 +51,6 @@ typedef struct TokenValue { }; } TokenValue; -#define TokenValue_EMPTY 0 -#define TokenValue_I64 1 -#define TokenValue_F64 2 -#define TokenValue_STR 3 - typedef struct Token { TokenIndex type; const char* start; diff --git a/src/compiler/compiler.c b/src/compiler/compiler.c new file mode 100644 index 00000000..9236623c --- /dev/null +++ b/src/compiler/compiler.c @@ -0,0 +1,20 @@ +#include "pocketpy/compiler/compiler.h" + +Error* pk_compile(pk_SourceData_ src){ + c11_array/*T=Token*/ tokens; + Error* err = pk_Lexer__process(src, &tokens); + if(err) return err; + + Token* data = (Token*)tokens.data; + printf("%s\n", py_Str__data(&src->filename)); + for(int i = 0; i < tokens.count; i++) { + Token* t = data + i; + py_Str tmp; + py_Str__ctor2(&tmp, t->start, t->length); + printf("[%d] %s: %s\n", t->line, pk_TokenSymbols[t->type], py_Str__data(&tmp)); + py_Str__dtor(&tmp); + } + + c11_array__dtor(&tokens); + return NULL; +} \ No newline at end of file diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index e30db95b..dc4478a8 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -814,16 +814,16 @@ Error* pk_Lexer__process_and_dump(pk_SourceData_ src, py_Str* out) { } // visit token value switch(token->value.index){ - case 0: break; - case 1: + case TokenValue_EMPTY: break; + case TokenValue_I64: pk_SStream__write_char(&ss, 'I'); pk_SStream__write_int(&ss, token->value._i64); break; - case 2: + case TokenValue_F64: pk_SStream__write_char(&ss, 'F'); pk_SStream__write_float(&ss, token->value._f64, -1); break; - case 3: { + case TokenValue_STR: { pk_SStream__write_char(&ss, 'S'); c11_string sv = py_Str__sv(&token->value._str); for(int i=0; i