|
|
@@ -18,6 +18,7 @@ void lexer_read_char(struct lexer *l);
|
|
|
|
|
|
struct token lexer_next_token(struct lexer *l);
|
|
|
struct str lexer_read_ident(struct lexer *l);
|
|
|
+struct str lexer_read_str_lit(struct lexer *l);
|
|
|
enum token_type_enum lexer_lookup_ident(struct str ident);
|
|
|
void lexer_skip_whitespace(struct lexer *l);
|
|
|
|
|
|
@@ -68,7 +69,10 @@ lexer_next_token(struct lexer *l)
|
|
|
case '<': t = token_create(TT_LABRACKET, str_from_cstr("<", 1)); break;
|
|
|
case '>': t = token_create(TT_RABRACKET, str_from_cstr(">", 1)); break;
|
|
|
case '\'': t = token_create(TT_SQUOTE, str_from_cstr("'", 1)); break;
|
|
|
- case '"': t = token_create(TT_DQUOTE, str_from_cstr("\"", 1)); break;
|
|
|
+ case '"':
|
|
|
+ t = token_create(TT_STR_LIT, lexer_read_str_lit(l));
|
|
|
+ return t;
|
|
|
+ break;
|
|
|
case '\0': t = token_create(TT_EOF, STR_EMPTY); break;
|
|
|
default:
|
|
|
if ( _lexer_is_letter(l->c) ) {
|
|
|
@@ -94,6 +98,18 @@ lexer_read_ident(struct lexer *l)
|
|
|
return str_slice(l->in, pos, l->pos);
|
|
|
}
|
|
|
|
|
|
+struct str
|
|
|
+lexer_read_str_lit(struct lexer *l)
|
|
|
+{
|
|
|
+ size_t pos = l->pos;
|
|
|
+ lexer_read_char(l);
|
|
|
+ while ( l->c != '"' ) {
|
|
|
+ lexer_read_char(l);
|
|
|
+ }
|
|
|
+ lexer_read_char(l);
|
|
|
+ return str_slice(l->in, pos+1, l->pos-1);
|
|
|
+}
|
|
|
+
|
|
|
enum token_type_enum
|
|
|
lexer_lookup_ident(struct str ident)
|
|
|
{
|