diff --git a/src/copler/main.c b/src/copler/main.c index 53bd933..f2d9a40 100644 --- a/src/copler/main.c +++ b/src/copler/main.c @@ -1,6 +1,9 @@ #include "copler.h" +#include "../lexer/lexer.h" int main(){ - + init_keywordsSearchTree(); + + STNode_free(keywordsSearchTree); return 0; } \ No newline at end of file diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index eb18510..aa52791 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -1,8 +1,7 @@ #include "lexer.h" +#include "../../../kerep/src/String/string.h" -Autoarr_define(Token); - -typedef struct SourceFileInfo{ +typedef struct SharedLexerData{ char* _source; char* _filename; Autoarr(Token)* _tokens; @@ -11,42 +10,257 @@ typedef struct SourceFileInfo{ string _label; uint32 _linenum; uint32 _charnum; -} SourceFileInfo; +} SharedLexerData; -#define source sfi->_source -#define filename sfi->_filename -#define tokens sfi->_tokens -#define context sfi->_context -#define line sfi->_line -#define label sfi->_label -#define linenum sfi->_linenum -#define charnum sfi->_charnum +#define source sld->_source +#define filename sld->_filename +#define tokens sld->_tokens +#define context sld->_context +#define line sld->_line +#define label sld->_label +#define linenum sld->_linenum +#define charnum sld->_charnum -Maybe _throw_wrongchar(SourceFileInfo* sfi){ +Maybe _throw_wrongchar(SharedLexerData* sld){ char* errline=string_extract(line); + char* _context=string_extract(context); printf("\n\e[91mwrong char <%c> at [%s:%u:%u %s]\n >>> %s\n", source[charnum], filename,linenum,charnum,context, errline); exit(96); } -#define throw_wrongchar(freeMem) { freeMem; _throw_wrongchar(sfi); } - -char _charFromEscapeStr(string estr, SourceFileInfo* sfi){ - if(*estr.ptr!='\\') throw("first char is not \\"); - switch(*(++estr.ptr)){ - case 'n': return '\n'; - case 'r': return '\r'; - case 't': return '\t'; - case 'e': return '\e'; - case '\\': return '\\'; - case '"': return '"'; - case '\'': return '\''; - default: throw_wrongchar(;); +#define throw_wrongchar(freeMem) { freeMem; return _throw_wrongchar(sld); } + +#define addTok(id) Autoarr_add(tokens, default_tokens[id]) + +void _addTok_ifnext(char next, TokenId yes, TokenId no, SharedLexerData* sld){ + if(*(++source)==next){ + addTok(yes); + } + else { + source--; + addTok(no); } } -#define charFromEscapeStr(estr) _charFromEscapeStr(estr, sfi) +#define addTok_ifnext(nextChar, yesTok, noTok) _addTok_ifnext(nextChar, yesTok, noTok, sld) -Autoarr(Token)* lexan(char* _source, char* _filename){ - SourceFileInfo sfi={ +// adds