0
Ich mache einen Lexer in c und ich bemerkte, dass beim Lesen des Test-Codes, dass der Dateipuffer ein seltsames Zeichen, das als Leerzeichen druckt. Aus irgendeinem Grund liest der Lexer es aus dem Puffer und behandelt es wie ein Leerzeichen.Keep lexer lesen ersten Zeichen in Datei
Testdatei: mo on
Ausgang
Current character: " ", Length: 6, Pointer: 0
Current character: "m", Length: 6, Pointer: 1
Type:2 {
Line: 1
Pos: 0
Number: 21646720
Real: 21646720
String: 'mo'
}
Current character: " ", Length: 6, Pointer: 3
Current character: "o", Length: 6, Pointer: 4
Type:2 {
Line: 1
Pos: 0
Number: 21683576
Real: 21683576
String: 'o'
}
Code
static char lexer_look(lexer_t* lexer, size_t ahead) {
if (lexer->len < lexer->ptr + ahead) {
error_new(lexer->errors, 0, 0, "The lexer tried to index %d out of bounds %d", lexer->ptr + ahead, lexer->len);
return;
}
return lexer->src[lexer->ptr + ahead];
}
static token_t* next_token(lexer_t* lexer) {
token_t* token = NULL;
while (token == NULL && can_adv(lexer, 1)) {
const char c = lexer_look(lexer, 0);
if (DEBUG)
printf("Current character: \"%c\", Length: %d, Pointer: %d\n", lexer_look(lexer, 0), lexer->len, lexer->ptr);
switch (c) {
case '\n':
new_line(lexer);
lexer_adv(lexer, 1);
break;
case '\"':
token = lexer_str(lexer);
break;
case '#':
lexer_comment(lexer);
break;
default:
if (isalpha(c) || c == '_')
token = lexer_ident(lexer);
else if (isspace(c))
lexer_adv(lexer, 1);
else
break;
}
}
return token;
}
Wenn Ihr Problem ist, dass 'lexer_look' ein seltsames Zeichen zurückgibt, dann sollten Sie vielleicht den Code für' lexer_look' posten? – immibis
das C-Zeichen in den Typ von 'static int' geändert hat, funktionierte aus irgendeinem Grund; Allerdings habe ich lexer_look zum ursprünglichen Beitrag hinzugefügt. – Hedron
sieht für mich wie ein off-by-one aus: 'if (lexer-> len < lexer-> ptr + ahead) {' -> 'if (lexer-> ptr + ahead> = lexer-> len) {' – wildplasser