|
@@ -50,30 +50,32 @@ lexer_read_char(struct lexer *l)
|
|
|
struct token
|
|
struct token
|
|
|
lexer_next_token(struct lexer *l)
|
|
lexer_next_token(struct lexer *l)
|
|
|
{
|
|
{
|
|
|
|
|
+#define _LEXER_CUR_CHAR str_slice(l->in, l->pos, l->pos+1)
|
|
|
|
|
+
|
|
|
struct token t = TOKEN_ILLEGAL;
|
|
struct token t = TOKEN_ILLEGAL;
|
|
|
|
|
|
|
|
lexer_skip_whitespace(l);
|
|
lexer_skip_whitespace(l);
|
|
|
|
|
|
|
|
switch ( l->c ) {
|
|
switch ( l->c ) {
|
|
|
- case '=': t = token_create(TT_ASSIGN, str_from_cstr("=", 1)); break;
|
|
|
|
|
- case ';': t = token_create(TT_SEMICOLON, str_from_cstr(";", 1)); break;
|
|
|
|
|
- case '(': t = token_create(TT_LPAREN, str_from_cstr("(", 1)); break;
|
|
|
|
|
- case ')': t = token_create(TT_RPAREN, str_from_cstr(")", 1)); break;
|
|
|
|
|
- case ',': t = token_create(TT_COMMA, str_from_cstr(",", 1)); break;
|
|
|
|
|
- case '*': t = token_create(TT_ASTERISK, str_from_cstr("*", 1)); break;
|
|
|
|
|
- case '-': t = token_create(TT_DASH, str_from_cstr("-", 1)); break;
|
|
|
|
|
- case '.': t = token_create(TT_DOT, str_from_cstr(".", 1)); break;
|
|
|
|
|
- case '+': t = token_create(TT_PLUS, str_from_cstr("+", 1)); break;
|
|
|
|
|
- case '{': t = token_create(TT_LBRACE, str_from_cstr("{", 1)); break;
|
|
|
|
|
- case '}': t = token_create(TT_RBRACE, str_from_cstr("}", 1)); break;
|
|
|
|
|
- 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_ASSIGN, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case ';': t = token_create(TT_SEMICOLON, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '(': t = token_create(TT_LPAREN, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case ')': t = token_create(TT_RPAREN, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case ',': t = token_create(TT_COMMA, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '*': t = token_create(TT_ASTERISK, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '-': t = token_create(TT_DASH, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '.': t = token_create(TT_DOT, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '+': t = token_create(TT_PLUS, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '{': t = token_create(TT_LBRACE, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '}': t = token_create(TT_RBRACE, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '<': t = token_create(TT_LABRACKET, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '>': t = token_create(TT_RABRACKET, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '\'': t = token_create(TT_SQUOTE, _LEXER_CUR_CHAR); break;
|
|
|
case '"':
|
|
case '"':
|
|
|
t = token_create(TT_STR_LIT, lexer_read_str_lit(l));
|
|
t = token_create(TT_STR_LIT, lexer_read_str_lit(l));
|
|
|
return t;
|
|
return t;
|
|
|
break;
|
|
break;
|
|
|
- case '\0': t = token_create(TT_EOF, STR_EMPTY); break;
|
|
|
|
|
|
|
+ case '\0': t = token_create(TT_EOF, STR_EMPTY); break;
|
|
|
default:
|
|
default:
|
|
|
if ( _lexer_is_letter(l->c) ) {
|
|
if ( _lexer_is_letter(l->c) ) {
|
|
|
struct str ident = lexer_read_ident(l);
|
|
struct str ident = lexer_read_ident(l);
|
|
@@ -86,6 +88,8 @@ lexer_next_token(struct lexer *l)
|
|
|
lexer_read_char(l);
|
|
lexer_read_char(l);
|
|
|
|
|
|
|
|
return t;
|
|
return t;
|
|
|
|
|
+
|
|
|
|
|
+#undef _LEXER_CUR_CHAR
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
struct str
|
|
struct str
|