diff options
Diffstat (limited to 'src/lex.cpp')
-rw-r--r-- | src/lex.cpp | 92 |
1 files changed, 16 insertions, 76 deletions
diff --git a/src/lex.cpp b/src/lex.cpp index 3746c91..9415d8b 100644 --- a/src/lex.cpp +++ b/src/lex.cpp @@ -34,26 +34,6 @@ namespace solar { - -struct keyword_t { - const char *keyword; - int token; -}; - -/* the keyword list must be sorted */ -static const keyword_t keywords[] = { - {"%extra_arg", TOK_EXTRA_ARG}, - {"%header", TOK_HEADER}, - {"%source", TOK_SOURCE}, - {"%type", TOK_TYPE}, -}; - -static int compare_keywords(const void *v1, const void *v2) { - const keyword_t *k1 = static_cast<const keyword_t*>(v1), *k2 = static_cast<const keyword_t*>(v2); - return std::strcmp(k1->keyword, k2->keyword); -} - - bool lex_t::advance() { if (start > 0) { std::memmove(buffer, buffer+start, end - start); @@ -183,61 +163,6 @@ int lex_t::lex_string(parse_token_value_t *value) { return TOK_STRING; } -/* -int lex_t::lex_number(parse_token_value_t *value) { - if (needspace) - return syntax_error(value); - - while (next(false)) { - char cur = current(); - - if (cur >= '0' && cur <= '9') - continue; - - if (cur == 'x' || (cur >= 'a' && cur <= 'f') || (cur >= 'A' && cur <= 'F')) - continue; - - break; - } - - char *endptr, *token = get_token(); - value->number = std::strtoull(token, &endptr, 0); - - bool ok = !*endptr; - free(token); - - if (!ok) - return syntax_error(value); - - consume(true); - - return TOK_UINT; -}*/ - -int lex_t::lex_keyword(parse_token_value_t *value) { - if (needspace) - return syntax_error(value); - - while (next(false)) { - char cur = current(); - - if (!((cur >= 'a' && cur <= 'z') || (cur >= '0' && cur <= '9') || cur == '_')) - break; - } - - std::string *token = get_token(); - const keyword_t key = { .keyword = token->c_str(), .token = 0 }; - const keyword_t *ret = static_cast<const keyword_t*>(bsearch(&key, keywords, array_size(keywords), sizeof(keyword_t), compare_keywords)); - delete token; - - if (!ret) - return syntax_error(value); - - consume(true); - - return ret->token; -} - int lex_t::unterminated_block(parse_token_value_t *value) { if (ferror(file)) return io_error(value); @@ -366,8 +291,18 @@ int lex_t::lex(parse_token_value_t *value) { case '\r': next(true); consume(false); + dumb_mode = false; continue; + } + + if (dumb_mode) { + token = current(); + next(true); + consume(false); + return token; + } + switch (current()) { case ';': case ':': case '|': @@ -432,7 +367,12 @@ int lex_t::lex(parse_token_value_t *value) { return lex_symbol(value); case '%': - return lex_keyword(value); + dumb_mode = true; + + token = current(); + next(true); + consume(false); + return token; default: return syntax_error(value); |