lang: lex: add new lex token type ids
This commit is contained in:
52
lang/lex.c
52
lang/lex.c
@@ -42,6 +42,8 @@ static struct lex_token_def keywords[] = {
|
||||
LEX_TOKEN_DEF(IVY_KW_NOT, "not"),
|
||||
LEX_TOKEN_DEF(IVY_KW_WHILE, "while"),
|
||||
LEX_TOKEN_DEF(IVY_KW_FOR, "for"),
|
||||
LEX_TOKEN_DEF(IVY_KW_CONTINUE, "continue"),
|
||||
LEX_TOKEN_DEF(IVY_KW_BREAK, "break"),
|
||||
LEX_TOKEN_DEF(IVY_KW_MATCH, "match"),
|
||||
LEX_TOKEN_DEF(IVY_KW_UNLESS, "unless"),
|
||||
LEX_TOKEN_DEF(IVY_KW_IN, "in"),
|
||||
@@ -49,7 +51,10 @@ static struct lex_token_def keywords[] = {
|
||||
LEX_TOKEN_DEF(IVY_KW_GET, "get"),
|
||||
LEX_TOKEN_DEF(IVY_KW_SET, "set"),
|
||||
LEX_TOKEN_DEF(IVY_KW_END, "end"),
|
||||
LEX_TOKEN_DEF(IVY_KW_VAR, "var"),
|
||||
LEX_TOKEN_DEF(IVY_KW_GLOBAL, "global"),
|
||||
LEX_TOKEN_DEF(IVY_KW_TRUE, "true"),
|
||||
LEX_TOKEN_DEF(IVY_KW_FALSE, "false"),
|
||||
LEX_TOKEN_DEF(IVY_KW_NULL, "null"),
|
||||
};
|
||||
static const size_t nr_keywords = sizeof keywords / sizeof keywords[0];
|
||||
|
||||
@@ -376,11 +381,11 @@ static int peek(struct ivy_lexer *lex)
|
||||
}
|
||||
|
||||
if (status != IVY_OK) {
|
||||
return status;
|
||||
return -status;
|
||||
}
|
||||
|
||||
if (lex->lex_linebuf_len == 0) {
|
||||
return IVY_ERR_EOF;
|
||||
return -IVY_ERR_EOF;
|
||||
}
|
||||
|
||||
int c = lex->lex_linebuf[lex->lex_linebuf_ptr];
|
||||
@@ -396,15 +401,15 @@ static int peek_next(struct ivy_lexer *lex)
|
||||
}
|
||||
|
||||
if (status != IVY_OK) {
|
||||
return status;
|
||||
return -status;
|
||||
}
|
||||
|
||||
if (lex->lex_linebuf_len == 0) {
|
||||
return IVY_ERR_EOF;
|
||||
return -IVY_ERR_EOF;
|
||||
}
|
||||
|
||||
if (lex->lex_linebuf_ptr + 1 >= lex->lex_linebuf_len) {
|
||||
return IVY_ERR_EOF;
|
||||
return -IVY_ERR_EOF;
|
||||
}
|
||||
|
||||
int c = lex->lex_linebuf[lex->lex_linebuf_ptr + 1];
|
||||
@@ -420,11 +425,11 @@ static int advance(struct ivy_lexer *lex)
|
||||
}
|
||||
|
||||
if (status != IVY_OK) {
|
||||
return status;
|
||||
return -status;
|
||||
}
|
||||
|
||||
if (lex->lex_linebuf_len == 0) {
|
||||
return IVY_ERR_EOF;
|
||||
return -IVY_ERR_EOF;
|
||||
}
|
||||
|
||||
int c = lex->lex_linebuf[lex->lex_linebuf_ptr++];
|
||||
@@ -623,12 +628,12 @@ static enum ivy_status read_line_comment(struct ivy_lexer *lex)
|
||||
while (true) {
|
||||
int c = advance(lex);
|
||||
|
||||
if (c == IVY_ERR_EOF || c == '\n') {
|
||||
if (c == -IVY_ERR_EOF || c == '\n') {
|
||||
break;
|
||||
}
|
||||
|
||||
if (c < 0) {
|
||||
return c;
|
||||
return -c;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -643,7 +648,7 @@ static enum ivy_status read_block_comment(struct ivy_lexer *lex)
|
||||
while (depth > 0) {
|
||||
int c = peek(lex);
|
||||
if (c < 0) {
|
||||
return c;
|
||||
return -c;
|
||||
}
|
||||
|
||||
if (!buf[0]) {
|
||||
@@ -717,12 +722,12 @@ static enum ivy_status read_atom(struct ivy_lexer *lex)
|
||||
while (true) {
|
||||
int c = peek(lex);
|
||||
|
||||
if (c == IVY_ERR_EOF) {
|
||||
if (c == -IVY_ERR_EOF) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (c < 0) {
|
||||
return c;
|
||||
return -c;
|
||||
}
|
||||
|
||||
if (!isalnum(c) && c != ':' && c != '_') {
|
||||
@@ -756,6 +761,9 @@ static enum ivy_status read_string_content(struct ivy_lexer *lex)
|
||||
|
||||
while (true) {
|
||||
c = peek(lex);
|
||||
if (c < 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (state->s_type == STATE_FSTRING && (c == '\'' || c == '{')) {
|
||||
break;
|
||||
@@ -794,6 +802,9 @@ static enum ivy_status read_symbol(struct ivy_lexer *lex)
|
||||
|
||||
while (true) {
|
||||
int c = peek(lex);
|
||||
if (c < 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
struct ivy_lexer_symbol_node *next = get_symbol_node(node, c);
|
||||
if (!next) {
|
||||
@@ -853,12 +864,12 @@ static enum ivy_status read_number(struct ivy_lexer *lex)
|
||||
|
||||
while (true) {
|
||||
int c = peek(lex);
|
||||
if (c == IVY_ERR_EOF) {
|
||||
if (c == -IVY_ERR_EOF) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (c < 0) {
|
||||
return c;
|
||||
return -c;
|
||||
}
|
||||
|
||||
if (c == '_') {
|
||||
@@ -1036,7 +1047,7 @@ static enum ivy_status pump_tokens(struct ivy_lexer *lex)
|
||||
int c = peek(lex);
|
||||
|
||||
if (c < 0) {
|
||||
return c;
|
||||
return -c;
|
||||
}
|
||||
|
||||
if (state->s_type == STATE_STRING && c != '"') {
|
||||
@@ -1067,7 +1078,7 @@ static enum ivy_status pump_tokens(struct ivy_lexer *lex)
|
||||
}
|
||||
|
||||
if (c < 0) {
|
||||
return c;
|
||||
return -c;
|
||||
}
|
||||
|
||||
return push_linefeed(lex);
|
||||
@@ -1227,6 +1238,8 @@ const char *ivy_keyword_to_string(enum ivy_keyword keyword)
|
||||
ENUM_STR(IVY_KW_ELSE);
|
||||
ENUM_STR(IVY_KW_WHILE);
|
||||
ENUM_STR(IVY_KW_FOR);
|
||||
ENUM_STR(IVY_KW_CONTINUE);
|
||||
ENUM_STR(IVY_KW_BREAK);
|
||||
ENUM_STR(IVY_KW_MATCH);
|
||||
ENUM_STR(IVY_KW_UNLESS);
|
||||
ENUM_STR(IVY_KW_IN);
|
||||
@@ -1234,7 +1247,10 @@ const char *ivy_keyword_to_string(enum ivy_keyword keyword)
|
||||
ENUM_STR(IVY_KW_GET);
|
||||
ENUM_STR(IVY_KW_SET);
|
||||
ENUM_STR(IVY_KW_END);
|
||||
ENUM_STR(IVY_KW_VAR);
|
||||
ENUM_STR(IVY_KW_GLOBAL);
|
||||
ENUM_STR(IVY_KW_TRUE);
|
||||
ENUM_STR(IVY_KW_FALSE);
|
||||
ENUM_STR(IVY_KW_NULL);
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user