2016-08-06 2 views
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; 
} 
+0

'lexer_look'이 이상한 문자를 반환한다는 문제가 있다면, 'lexer_look'에 대한 코드를 게시해야할까요? – immibis

+0

C 문자를'static int '타입으로 변경하는 것은 어떤 이유로 작동했습니다; 그러나 원래 게시물에 lexer_look을 추가했습니다. – Hedron

+0

는 나에게 하나씩 비웃음처럼 보입니다.'if (lexer-> ptr + ahead> = lexer-> len) {'(lexer-> ptr + – wildplasser

답변

0

cisalpha()의 범위 EOF..UCHAR_MAX에 한정된 값 intisspace() 정의되어야 코드는를 갖도록 신뢰할 수있는 행동.

관련 문제