0
나는 C로 렉서를 만들고 있는데, 파일 버퍼가 공간으로 인쇄되는 이상한 문자를 가지고 있다는 것을 테스트 코드를 읽을 때 알아 차렸습니다. 어떤 이유로 렉서는 버퍼에서 그것을 읽고 공간처럼 취급합니다.lexer가 파일의 첫 번째 문자를 읽지 않게하십시오.
에게 는테스트 파일 : mo on
출력
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'
}
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;
}
'lexer_look'이 이상한 문자를 반환한다는 문제가 있다면, 'lexer_look'에 대한 코드를 게시해야할까요? – immibis
C 문자를'static int '타입으로 변경하는 것은 어떤 이유로 작동했습니다; 그러나 원래 게시물에 lexer_look을 추가했습니다. – Hedron
는 나에게 하나씩 비웃음처럼 보입니다.'if (lexer-> ptr + ahead> = lexer-> len) {'(lexer-> ptr + – wildplasser