| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef TOOLS_GN_TOKENIZER_H_ | |
| 6 #define TOOLS_GN_TOKENIZER_H_ | |
| 7 | |
| 8 #include <vector> | |
| 9 | |
| 10 #include "base/basictypes.h" | |
| 11 #include "base/strings/string_piece.h" | |
| 12 #include "tools/gn/err.h" | |
| 13 #include "tools/gn/token.h" | |
| 14 | |
| 15 class InputFile; | |
| 16 | |
| 17 class Tokenizer { | |
| 18 public: | |
| 19 static std::vector<Token> Tokenize(const InputFile* input_file, Err* err); | |
| 20 | |
| 21 // Counts lines in the given buffer (the first line is "1") and returns | |
| 22 // the byte offset of the beginning of that line, or (size_t)-1 if there | |
| 23 // aren't that many lines in the file. Note that this will return the byte | |
| 24 // one past the end of the input if the last character is a newline. | |
| 25 // | |
| 26 // This is a helper function for error output so that the tokenizer's | |
| 27 // notion of lines can be used elsewhere. | |
| 28 static size_t ByteOffsetOfNthLine(const base::StringPiece& buf, int n); | |
| 29 | |
| 30 // Returns true if the given offset of the string piece counts as a newline. | |
| 31 // The offset must be in the buffer. | |
| 32 static bool IsNewline(const base::StringPiece& buffer, size_t offset); | |
| 33 | |
| 34 static bool IsIdentifierFirstChar(char c) { | |
| 35 return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_'; | |
| 36 } | |
| 37 | |
| 38 static bool IsIdentifierContinuingChar(char c) { | |
| 39 // Also allow digits after the first char. | |
| 40 return IsIdentifierFirstChar(c) || (c >= '0' && c <= '9'); | |
| 41 } | |
| 42 | |
| 43 private: | |
| 44 // InputFile must outlive the tokenizer and all generated tokens. | |
| 45 explicit Tokenizer(const InputFile* input_file, Err* err); | |
| 46 ~Tokenizer(); | |
| 47 | |
| 48 std::vector<Token> Run(); | |
| 49 | |
| 50 void AdvanceToNextToken(); | |
| 51 Token::Type ClassifyCurrent() const; | |
| 52 void AdvanceToEndOfToken(const Location& location, Token::Type type); | |
| 53 | |
| 54 bool IsCurrentWhitespace() const; | |
| 55 bool IsCurrentNewline() const; | |
| 56 bool IsCurrentStringTerminator(char quote_char) const; | |
| 57 | |
| 58 bool CanIncrement() const { return cur_ < input_.size(); } | |
| 59 | |
| 60 // Increments the current location by one. | |
| 61 void Advance(); | |
| 62 | |
| 63 // Returns the current character in the file as a location. | |
| 64 Location GetCurrentLocation() const; | |
| 65 | |
| 66 Err GetErrorForInvalidToken(const Location& location) const; | |
| 67 | |
| 68 bool done() const { return at_end() || has_error(); } | |
| 69 | |
| 70 bool at_end() const { return cur_ == input_.size(); } | |
| 71 char cur_char() const { return input_[cur_]; } | |
| 72 | |
| 73 bool has_error() const { return err_->has_error(); } | |
| 74 | |
| 75 const InputFile* input_file_; | |
| 76 const base::StringPiece input_; | |
| 77 Err* err_; | |
| 78 size_t cur_; // Byte offset into input buffer. | |
| 79 | |
| 80 int line_number_; | |
| 81 int char_in_line_; | |
| 82 | |
| 83 DISALLOW_COPY_AND_ASSIGN(Tokenizer); | |
| 84 }; | |
| 85 | |
| 86 #endif // TOOLS_GN_TOKENIZER_H_ | |
| OLD | NEW |