4 * Created on: Aug 26, 2012
14 bool Tokenizer::HasMore() {
18 void Tokenizer::Putback(const Token &t) {
20 throw LexerError("Tokenizer: double putback not supported");
27 const Tokenizer::Token &Tokenizer::Peek() {
35 Tokenizer::Token Tokenizer::GetNext() {
44 Tokenizer::Token Tokenizer::ReadToken() {
45 std::istream::char_type c;
47 while (std::isspace(c)) in.get(c);
49 case Token::ANGLE_BRACKET_OPEN:
50 case Token::ANGLE_BRACKET_CLOSE:
51 case Token::CHEVRON_OPEN:
52 case Token::CHEVRON_CLOSE:
55 case Token::BRACKET_OPEN:
56 case Token::BRACKET_CLOSE:
57 case Token::PARENTHESIS_OPEN:
58 case Token::PARENTHESIS_CLOSE:
59 return Token ((Token::Type) c);
61 case '0': case '1': case '2': case '3': case '4':
62 case '5': case '6': case '7': case '8': case '9':
71 Token t(ReadIdentifier());
72 if (std::isupper(c)) {
73 t.type = Token::TYPE_NAME;
74 } else if (std::islower(c)) {
77 throw LexerError(std::string("Tokenizer: cannot parse token: ") + c);
84 Tokenizer::Token Tokenizer::ReadNumber() {
85 Token t(Token::NUMBER);
86 bool isNegative(false);
88 std::istream::char_type c;
92 } else if (c != '+') {
97 if (!std::isdigit(c)) {
105 if (isNegative) t.number *= -1;
110 Tokenizer::Token Tokenizer::ReadString() {
111 Token t(Token::STRING);
114 std::istream::char_type c;
117 throw LexerError("Tokenizer: strings must begin with '\"'");
125 t.str.push_back('\n');
128 t.str.push_back('\r');
131 t.str.push_back('\t');
137 } else if (c == '"') {
139 } else if (c == '\\') {
149 Tokenizer::Token Tokenizer::ReadIdentifier() {
150 Token t(Token::IDENTIFIER);
152 std::istream::char_type c;
154 if (std::isalnum(c) || c == '_') {
165 bool Tokenizer::CheckKeyword(Token &t) {
166 if (t.str == "export") {
167 t.type = Token::KEYWORD_EXPORT;
169 } else if (t.str == "false") {
170 t.type = Token::KEYWORD_FALSE;
172 } else if (t.str == "include") {
173 t.type = Token::KEYWORD_INCLUDE;
175 } else if (t.str == "true") {
176 t.type = Token::KEYWORD_TRUE;