2016-08-06 1 views
0

Я делаю лексер в c, и я заметил, что при чтении тестового кода, что в буфере файлов есть странный символ, который печатает как пробел. По какой-то причине лексер читает его из буфера и рассматривает его как пространство.Держите лексер от чтения первого символа в файле

тестовый файл: 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; 
} 
+0

Если ваша проблема в том, что 'lexer_look' возвращает странный символ, то, возможно, вам следует опубликовать код для' lexer_look'? – immibis

+0

по какой-то причине сменил символ C на тип 'static int'; Однако я добавил lexer_look к исходному сообщению. – Hedron

+0

выглядит как один за другим: 'if (lexer-> len < lexer-> ptr + вперед) {' -> 'if (lexer-> ptr + ahead> = lexer-> len) {' – wildplasser

ответ

0

c должен быть определен как int со значением ограниченного в диапазоне EOF..UCHAR_MAX для isalpha() и isspace() иметь надежное поведение.

Смежные вопросы