diff --git a/README.md b/README.md index b30f7f2..d2dcbef 100644 --- a/README.md +++ b/README.md @@ -17,20 +17,20 @@ bash build.c - [x] bool - [x] Lex keywords - [x] Ignore comments (//, /**/, #) - - [ ] Lex delimiters + - [x] Lex delimiters - [x] () - [x] {} - [x] . - [x] : - [x] , - - [ ] ==, = - - [ ] >, >= - - [ ] <, <= - - [ ] !, != - - [ ] +, +=, ++ - - [ ] -, -=, -- - - [ ] *, *= - - [ ] /, /= + - [x] ==, = + - [x] >, >= + - [x] <, <= + - [x] !, != + - [x] +, +=, ++ + - [x] -, -=, -- + - [x] *, *= + - [x] /, /= - [ ] Lex types - [x] Basic types (int, double, string, bool, char) - [ ] Advanced types (fun(...), template(...), object(...)) diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index 16b51f6..c420408 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -503,6 +503,44 @@ ResultType(voidptr, charptr) lex(SolsLexer* lexer) { break; } + // These characters may be followed by an equals sign, or nothing else. + case '=': + case '!': + case '>': + case '<': + case '*': + case '/': { + if (strcmp(buf.str, "") != 0) { + ResultType(SolsToken, charptr) result = identifyToken(buf.str); + if (result.error) { + return Error(voidptr, charptr, createParsingError(lineNum, currentLine.str, result.as.error)); + } + addTokenToSolsTokens(&lexer->output, result.as.success); + DESTROY_ESTR(buf); + buf = CREATE_ESTR(""); + } + ResultType(char, Nothing) next = lexerPeek(lexer, 1); + if (next.error || next.as.success != '=') { + char tmp[] = {chr.as.success, '\0'}; + ResultType(SolsToken, charptr) result = identifyToken(tmp); + if (result.error) { + return Error(voidptr, charptr, createParsingError(lineNum, currentLine.str, result.as.error)); + } + addTokenToSolsTokens(&lexer->output, result.as.success); + } + if (next.as.success == '=') { + char tmp[] = {chr.as.success, '=', '\0'}; + ResultType(SolsToken, charptr) result = identifyToken(tmp); + if (result.error) { + return Error(voidptr, charptr, createParsingError(lineNum, currentLine.str, result.as.error)); + } + addTokenToSolsTokens(&lexer->output, result.as.success); + lexerConsume(lexer); + } + break; + } + + // '.' requires checking whether it's a number or an identifier after case '.': { ResultType(char, Nothing) peek = lexerPeek(lexer, 1);