more token stuff

This commit is contained in:
2026-02-15 19:47:23 +11:00
parent 08d2bb1bd3
commit 2f87e0b4b1
3 changed files with 99 additions and 1 deletions

View File

@@ -286,6 +286,24 @@ ResultType(SolsToken, charptr) identifyToken(const char* token) {
if (strcmp(token, "=") == 0 || strcmp(token, "is") == 0) {
return Success(SolsToken, charptr, {STT_OP_SET});
}
if (strcmp(token, "+=") == 0) {
return Success(SolsToken, charptr, {STT_OP_ADDTO});
}
if (strcmp(token, "-=") == 0) {
return Success(SolsToken, charptr, {STT_OP_SUBTO});
}
if (strcmp(token, "*=") == 0) {
return Success(SolsToken, charptr, {STT_OP_MULTO});
}
if (strcmp(token, "/=") == 0) {
return Success(SolsToken, charptr, {STT_OP_DIVTO});
}
if (strcmp(token, "++") == 0) {
return Success(SolsToken, charptr, {STT_OP_INCREMENT});
}
if (strcmp(token, "--") == 0) {
return Success(SolsToken, charptr, {STT_OP_DECREMENT});
}
// No appropriate token found, it's an identifier (I hope)
SolsToken id = {
@@ -406,6 +424,48 @@ ResultType(voidptr, charptr) lex(SolsLexer* lexer) {
break;
}
// These characters may be repeated, or followed by an equals sign.
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 != chr.as.success || 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);
}
if (next.as.success == chr.as.success) {
char tmp[] = {chr.as.success, 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);