Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.49 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5.  
  6. typedef struct {
  7.     const char* text;
  8.     unsigned    text_len;
  9.     unsigned    text_pos;
  10.  
  11.     const char* token;
  12.     unsigned    token_len;
  13. } lexer_t;
  14.  
  15. bool lexer_next_token(lexer_t* self)
  16. {
  17.     unsigned i;
  18.     unsigned len;
  19.     char     ch;
  20.    
  21.     for(i = self->text_pos, len = 0;
  22.         i != self->text_len;
  23.         i++, len++) {
  24.  
  25.         ch = self->text[i];
  26.        
  27.         if((ch < 'A' || ch > 'Z') &&
  28.            (ch < 'a' || ch > 'z')) {
  29.             if(ch != ' ') {
  30.                 if(len == 0) {
  31.                     self->token = &self->text[i];
  32.                     self->token_len = 1;
  33.                     self->text_pos = i + 1;
  34.                     return true;
  35.                 }
  36.            
  37.                 self->token = &self->text[i-len];
  38.                 self->token_len = len;
  39.                 self->text_pos = i;
  40.            
  41.                 return true;
  42.             } else {
  43.                 len = 0;
  44.             }
  45.         }
  46.     }
  47.  
  48.     if(len) {
  49.         self->token = &self->text[i-len];
  50.         self->token_len = len;
  51.         self->text_pos = i;
  52.         return true;
  53.     }
  54.  
  55.     return false;
  56. }
  57.  
  58. int main(int argc, char* argv[])
  59. {
  60.     const char* text = "hello, world";
  61.     lexer_t lexer = {0};
  62.  
  63.     lexer.text = text;
  64.     lexer.text_len = strlen(text);
  65.  
  66.     while(lexer_next_token(&lexer)) {
  67.         printf("%.*s\n",(int)lexer.token_len,lexer.token);
  68.     }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement