From 60988206444fe51796a68d31fe88811b69fc2930 Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Thu, 21 Jul 2022 01:18:55 +0300 Subject: [PATCH] 7 --- src/copler/main.c | 5 +- src/lexer/lexer.c | 491 ++++++++++++++++++++-------------------- src/lexer/lexer.h | 7 +- src/lexer/my_type_ext.h | 7 + src/lexer/tokens.c | 12 + src/lexer/tokens.h | 29 ++- 6 files changed, 289 insertions(+), 262 deletions(-) create mode 100644 src/lexer/my_type_ext.h create mode 100644 src/lexer/tokens.c 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