Cleaned up the TokenStringify function a bit (ignore the returning of a local variable) and updated the tokenizer to better handle new lines.

This commit is contained in:
2025-01-08 02:40:05 -06:00
parent 6d3f90183e
commit 428d674f54
3 changed files with 43 additions and 27 deletions
-1
View File
@@ -29,7 +29,6 @@ int main(int argc, char** argv) {
return 0; return 0;
} }
else printf("Found %d tokens.", tokens->Size);
for(int i = 0; i < tokens->Size; i++) { for(int i = 0; i < tokens->Size; i++) {
Token* token = tokens->Items[i]; Token* token = tokens->Items[i];
+11 -25
View File
@@ -13,43 +13,29 @@ struct _token* TokenCreate(TokenType type, int lineNumber, int columnNumber, boo
char* TokenStringify(const struct _token* token, bool valueOnly) { char* TokenStringify(const struct _token* token, bool valueOnly) {
if (!token) return NULL; if (!token) return NULL;
char type[32]; char buffer[32];
char number[32];
int length = StringifyTokenType(token->Type, type);
char* result = calloc(512, sizeof(char));
#ifdef DEBUG
#endif
switch(token->Type) { switch(token->Type) {
case Empty: case Empty:
snprintf(result, length + 1, "%s ", type); return "<>";
break;
case String: case String:
snprintf(result, 511, "%s \"%s\" ", type, token->Value.String);
break;
case Number:
snprintf(number, 32, "%d", token->Value.Number);
snprintf(result, 511, "%s %s", type, number);
break;
case Symbol: case Symbol:
snprintf(result, 511, "%s %s", type, token->Value.String); return token->Value.String;
case Number:
sprintf(buffer, "%d", token->Value.Number);
break; break;
case LineEnd: case LineEnd:
snprintf(result, 511, "%s\n", type); return "\n";
break;
case FileEnd: case FileEnd:
snprintf(result, length + 1, "%s ", type); return NULL;
break;
default: default:
snprintf(result, length + 2, "%s %c", type, token->Value.Operator[0]); strncpy(buffer, token->Value.Operator, 8);
//snprintf(buffer, length, "<%c>", type);
break; break;
} }
return result; return buffer;
} }
int StringifyTokenType(TokenType type, char buffer[32]) { int StringifyTokenType(TokenType type, char buffer[32]) {
+32 -1
View File
@@ -75,6 +75,7 @@ Array* Tokenize(const char* sourceCode, Dictionary** variables) {
case ')': case ')':
case '[': case '[':
case ']': case ']':
case ':':
Token* token = TokenCreate((TokenType)c, SourceLineNumber, SourceColumnNumber, true); Token* token = TokenCreate((TokenType)c, SourceLineNumber, SourceColumnNumber, true);
token->Value.Operator[0] = c; token->Value.Operator[0] = c;
@@ -99,6 +100,24 @@ void TokenizerExpectNumber(void) {
char c; char c;
while(TryPopTokenizer(&c)) { while(TryPopTokenizer(&c)) {
if (c == '\n') {
BackTokenzier();
break;
}
if (!isdigit(c)) break;
if (PeekTokenizer() == 'x' || PeekTokenizer() == 'X')
{
AdvanceTokenizer();
word[wordLength] = c;
word[wordLength + 1] = PeekTokenizer();
wordLength += 2;
continue;
}
if (wordLength == 255) break; //Sync, error etc here at some point. if (wordLength == 255) break; //Sync, error etc here at some point.
@@ -121,6 +140,12 @@ void TokenizerExpectWord() {
char c; char c;
while(TryPopTokenizer(&c)) { while(TryPopTokenizer(&c)) {
if (c == '\n') {
BackTokenzier();
break;
}
if (isspace(c)) { if (isspace(c)) {
break; break;
} }
@@ -160,6 +185,12 @@ void TokenizerExpectString(void) {
char c; char c;
while(TryPopTokenizer(&c)) { while(TryPopTokenizer(&c)) {
if (c == '\n') {
BackTokenzier();
break;
}
if (c == '"') break; if (c == '"') break;
if (c == '\\') { if (c == '\\') {
@@ -201,7 +232,7 @@ void TokenizerIgnoreLine(void) {
char c; char c;
while(TryPopTokenizer(&c)) { while(TryPopTokenizer(&c)) {
if (c == '\n') break; if (PeekTokenizer() == '\n') break;
} }
} }