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 Tokenizer::Token Tokenizer::GetNext() {
36 Tokenizer::Token Tokenizer::ReadToken() {
37 std::istream::char_type c;
39 while (std::isspace(c)) in.get(c);
41 case Token::ANGLE_BRACKET_OPEN:
42 case Token::ANGLE_BRACKET_CLOSE:
43 case Token::CHEVRON_OPEN:
44 case Token::CHEVRON_CLOSE:
47 case Token::BRACKET_OPEN:
48 case Token::BRACKET_CLOSE:
49 case Token::PARENTHESIS_OPEN:
50 case Token::PARENTHESIS_CLOSE:
51 return Token ((Token::Type) c);
53 case '0': case '1': case '2': case '3': case '4':
54 case '5': case '6': case '7': case '8': case '9':
63 Token t(ReadIdentifier());
64 if (std::isupper(c)) {
65 t.type = Token::TYPE_NAME;
66 } else if (std::islower(c)) {
69 throw LexerError(std::string("Tokenizer: cannot parse token: ") + c);
76 Tokenizer::Token Tokenizer::ReadNumber() {
77 Token t(Token::NUMBER);
78 bool isNegative(false);
80 std::istream::char_type c;
84 } else if (c != '+') {
89 if (!std::isdigit(c)) {
97 if (isNegative) t.number *= -1;
102 Tokenizer::Token Tokenizer::ReadString() {
103 Token t(Token::STRING);
106 std::istream::char_type c;
109 throw LexerError("Tokenizer: strings must begin with '\"'");
117 t.str.push_back('\n');
120 t.str.push_back('\r');
123 t.str.push_back('\t');
129 } else if (c == '"') {
131 } else if (c == '\\') {
141 Tokenizer::Token Tokenizer::ReadIdentifier() {
142 Token t(Token::IDENTIFIER);
144 std::istream::char_type c;
146 if (std::isalnum(c) || c == '_') {
157 bool Tokenizer::CheckKeyword(Token &t) {
158 if (t.str == "export") {
159 t.type = Token::KEYWORD_EXPORT;
161 } else if (t.str == "false") {
162 t.type = Token::KEYWORD_FALSE;
164 } else if (t.str == "include") {
165 t.type = Token::KEYWORD_INCLUDE;
167 } else if (t.str == "true") {
168 t.type = Token::KEYWORD_TRUE;