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

Wenn Ihr Problem ist, dass 'lexer_look' ein seltsames Zeichen zurückgibt, dann sollten Sie vielleicht den Code für' lexer_look' posten? – immibis

+0

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

+0

sieht für mich wie ein off-by-one aus: 'if (lexer-> len < lexer-> ptr + ahead) {' -> 'if (lexer-> ptr + ahead> = lexer-> len) {' – wildplasser

Antwort

0

c sollte im Bereich EOF..UCHAR_MAX für isalpha() und isspace() haben eine beschränkte als int mit einem Wert definiert werden, zuverlässiges Verhalten.