Advertisement
TheBirkIsReal

Untitled

Mar 24th, 2019
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. read_token :: proc(using parser: ^Parser) -> (Token, bool) {
  2.     for is_whitespace(current_rune) {
  3.         switch current_rune {
  4.         case '\n':
  5.             current_line += 1;
  6.             current_column = 1;
  7.         }
  8.         if _, ok := next_rune(parser); !ok do return {}, false;
  9.     }
  10.  
  11.     loc := get_current_sourceloc(parser);
  12.     loc.column -= 1;
  13.  
  14.     if offset > len(data) {
  15.         return Token{TokenKind.Eof, loc, "end of file"}, true;
  16.     }
  17.  
  18.     using TokenKind;
  19.     switch current_rune {
  20.     case 0:
  21.         return Token{TokenKind.Eof, loc, "end of file"}, true;
  22.     case '#':
  23.         for current_rune != '\n' {
  24.             if _, ok := next_rune(parser); !ok do return {}, false;
  25.             loc = get_current_sourceloc(parser);
  26.             loc.column -= 1;
  27.             if offset == len(data) do return Token{TokenKind.Eof, loc, "end of file"}, true;
  28.         }
  29.         return read_token(parser);
  30.     case '0'..'9':
  31.         //...
  32.         start := current_rune_offset;
  33.         found_dot := false;
  34.         for is_number(current_rune) || current_rune == '.' {
  35.             if current_rune == '.' {
  36.                 if found_dot {
  37.                     break;
  38.                 } else {
  39.                     found_dot = true;
  40.                 }
  41.             }
  42.             if _, ok := next_rune(parser); !ok do return {}, false;
  43.         }
  44.  
  45.         tok := Token{};
  46.         tok.lexeme = string(data[start:current_rune_offset]);
  47.         tok.kind = found_dot ? Number : Integer;
  48.         tok.loc = loc;
  49.  
  50.         return tok, true;
  51.     case '"':
  52.         if _, ok := next_rune(parser); !ok do return {}, false;
  53.         start := current_rune_offset;
  54.         for current_rune != '"' {
  55.             prev := current_rune;
  56.             if _, ok := next_rune(parser); !ok do return {}, false;
  57.  
  58.             if prev == '\\' && current_rune == '"' {
  59.                 if _, ok := next_rune(parser); !ok do return {}, false;
  60.             }
  61.         }
  62.  
  63.         tok := Token{};
  64.         tok.lexeme = string(data[start:current_rune_offset]);
  65.         tok.kind = String;
  66.         tok.loc = loc;
  67.  
  68.         if _, ok := next_rune(parser); !ok do return {}, false;
  69.  
  70.         return tok, true;
  71.     case '{':
  72.         if _, ok := next_rune(parser); !ok do return {}, false;    
  73.         return Token{LeftBrace, loc, "{"}, true;
  74.     case '}':
  75.         if _, ok := next_rune(parser); !ok do return {}, false;
  76.         return Token{RightBrace, loc, "}"}, true;
  77.     case ';':
  78.         if _, ok := next_rune(parser); !ok do return {}, false;
  79.         return Token{SemiColon, loc, ";"}, true;
  80.     case:
  81.         start := current_rune_offset;
  82.         for is_valid_identifier(current_rune) {
  83.             if _, ok := next_rune(parser); !ok do return {}, false;
  84.         }
  85.        
  86.         tok := Token{};
  87.         tok.lexeme = string(data[start:current_rune_offset]);
  88.         tok.kind = Ident;
  89.         tok.loc = loc;
  90.  
  91.         return tok, true;
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement