diff options
Diffstat (limited to 'src/lex.cpp')
-rw-r--r-- | src/lex.cpp | 61 |
1 files changed, 56 insertions, 5 deletions
diff --git a/src/lex.cpp b/src/lex.cpp index 5064dd7..3058232 100644 --- a/src/lex.cpp +++ b/src/lex.cpp @@ -337,13 +337,67 @@ int lex_t::lex(parse_token_value_t *value) { if (!next(true)) return syntax_error(value); - value->c = current(); + if (current() == '\\') { + if (!next(true)) + return syntax_error(value); + + switch (current()) { + case 'a': + value->c = '\a'; + break; + + case 'b': + value->c = '\b'; + break; + + case 'f': + value->c = '\f'; + break; + + case 'n': + value->c = '\n'; + break; + + case 'r': + value->c = '\r'; + break; + + case 't': + value->c = '\t'; + break; + + case 'v': + value->c = '\v'; + break; + + case '\\': + value->c = '\\'; + break; + + case '\'': + value->c = '\''; + break; + + case '"': + value->c = '"'; + break; + + case '?': + value->c = '?'; + break; + + default: + return syntax_error(value); + } + } + else { + value->c = current(); + } if (!next(true) || current() != '\'') return syntax_error(value); next(true); - consume(false); return TOK_CHAR; @@ -354,9 +408,6 @@ int lex_t::lex(parse_token_value_t *value) { case '"': return lex_string(value); - //case '0' ... '9': - //return lex_number(value); - case 'a' ... 'z': case 'A' ... 'Z': return lex_symbol(value); |