diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-04-06 18:50:03 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-04-06 18:50:03 +0200 |
commit | d6deff997e4f882d9fa46b109fd32e713f054a6d (patch) | |
tree | d0d5f6faf532234f239310c7376b737e1c284ea9 /src/lex.cpp | |
parent | 6fb60a72012f97f846477eb370d1a0706b1b4bc2 (diff) | |
download | solar-d6deff997e4f882d9fa46b109fd32e713f054a6d.tar solar-d6deff997e4f882d9fa46b109fd32e713f054a6d.zip |
Implement a lot of symbol value support
Diffstat (limited to 'src/lex.cpp')
-rw-r--r-- | src/lex.cpp | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/src/lex.cpp b/src/lex.cpp index 851ac87..3adfb5b 100644 --- a/src/lex.cpp +++ b/src/lex.cpp @@ -42,6 +42,7 @@ struct keyword_t { /* the keyword list must be sorted */ static const keyword_t keywords[] = { + {"%type", TOK_TYPE}, }; static int compare_keywords(const void *v1, const void *v2) { @@ -330,24 +331,21 @@ int lex_t::lex_block(parser_value_t *value) { return TOK_BLOCK; } -int lex_t::lex_symbol(parser_value_t *value, bool terminal) { +int lex_t::lex_symbol(parser_value_t *value) { if (needspace) return syntax_error(value); - while (next(false)) { - char cur = current(); + bool uc = true; + bool lc = true; - switch (cur) { + do { + switch (current()) { case 'A' ... 'Z': - if (!terminal) - break; - + lc = false; continue; case 'a' ... 'z': - if (terminal) - break; - + uc = false; continue; case '0' ... '9': @@ -356,10 +354,16 @@ int lex_t::lex_symbol(parser_value_t *value, bool terminal) { } break; - } + } while (next(false)); value->str = get_token(); - return terminal ? TOK_TERM : TOK_NONTERM; + + if (uc) + return TOK_SYMBOL_UC; + else if (lc) + return TOK_SYMBOL_LC; + else + return TOK_SYMBOL; } int lex_t::lex(parser_value_t *value) { @@ -382,6 +386,8 @@ int lex_t::lex(parser_value_t *value) { case ':': case '|': case '=': + case '(': + case ')': token = current(); next(true); consume(false); @@ -436,10 +442,11 @@ int lex_t::lex(parser_value_t *value) { return lex_number(value); case 'a' ... 'z': - return lex_symbol(value, false); - case 'A' ... 'Z': - return lex_symbol(value, true); + return lex_symbol(value); + + case '%': + return lex_keyword(value); default: return syntax_error(value); |