struct Location
{
std::string name;
- unsigned line;
+ unsigned line = 0;
+
+ Location() = default;
+ Location(const std::string &n, unsigned l): name(n), line(l) { }
};
class Tokenizer
std::string::const_iterator iter;
std::string::const_iterator source_end;
Location location;
- bool allow_preprocess;
+ bool progress_mark = false;
+ bool allow_preprocess = true;
+ bool suppress_line_advance = false;
std::string last_token;
std::deque<std::string> next_tokens;
void begin(const std::string &, const std::string &);
const std::string &peek_token(unsigned = 0);
const std::string &parse_token();
+ const std::string &get_last_token() const { return last_token; }
void expect(const std::string &);
+ void set_location(const Location &);
+ void clear_progress_mark() { progress_mark = false; }
+ bool get_progress_mark() const { return progress_mark; }
const Location &get_location() const { return location; }
private:
std::string parse_token_();
void preprocess();
std::string parse_identifier();
std::string parse_number();
+ std::string parse_string();
std::string parse_other();
void skip_comment_and_whitespace();
};