more token stuff
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user