Expand lexer support for expression tokens
This commit is contained in:
95
main.c
95
main.c
@@ -128,11 +128,55 @@ Token lex_token(Lexer *lex) {
|
||||
case ';': t.kind = TOK_SEMICOLON; break;
|
||||
case '?': t.kind = TOK_QUESTION; break;
|
||||
case '#': t.kind = TOK_HASH; break;
|
||||
case '+': t.kind = TOK_PLUS; break;
|
||||
case '-': t.kind = TOK_MINUS; break;
|
||||
case '*': t.kind = TOK_STAR; break;
|
||||
case '/': t.kind = TOK_SLASH; break;
|
||||
case '%': t.kind = TOK_PERCENT; break;
|
||||
case '+': {
|
||||
if (lex->at < lex->end && *lex->at == '+') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_INC;
|
||||
} else if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_PLUS_ASSIGN;
|
||||
} else {
|
||||
t.kind = TOK_PLUS;
|
||||
}
|
||||
} break;
|
||||
case '-': {
|
||||
if (lex->at < lex->end && *lex->at == '-') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_DEC;
|
||||
} else if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_MINUS_ASSIGN;
|
||||
} else if (lex->at < lex->end && *lex->at == '>') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_ARROW;
|
||||
} else {
|
||||
t.kind = TOK_MINUS;
|
||||
}
|
||||
} break;
|
||||
case '*': {
|
||||
if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_MUL_ASSIGN;
|
||||
} else {
|
||||
t.kind = TOK_STAR;
|
||||
}
|
||||
} break;
|
||||
case '/': {
|
||||
if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_DIV_ASSIGN;
|
||||
} else {
|
||||
t.kind = TOK_SLASH;
|
||||
}
|
||||
} break;
|
||||
case '%': {
|
||||
if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_MOD_ASSIGN;
|
||||
} else {
|
||||
t.kind = TOK_PERCENT;
|
||||
}
|
||||
} break;
|
||||
case '=': {
|
||||
if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
@@ -142,23 +186,33 @@ Token lex_token(Lexer *lex) {
|
||||
}
|
||||
} break;
|
||||
case '<': {
|
||||
if (lex->at < lex->end && *lex->at == '=') {
|
||||
if (lex->at < lex->end && *lex->at == '<') {
|
||||
lex_advance(lex);
|
||||
if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_LSHIFT_ASSIGN;
|
||||
} else {
|
||||
t.kind = TOK_LSHIFT;
|
||||
}
|
||||
} else if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_LEQ;
|
||||
} else if (lex->at < lex->end && *lex->at == '<') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_LSHIFT;
|
||||
} else {
|
||||
t.kind = TOK_LT;
|
||||
}
|
||||
} break;
|
||||
case '>': {
|
||||
if (lex->at < lex->end && *lex->at == '=') {
|
||||
if (lex->at < lex->end && *lex->at == '>') {
|
||||
lex_advance(lex);
|
||||
if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_RSHIFT_ASSIGN;
|
||||
} else {
|
||||
t.kind = TOK_RSHIFT;
|
||||
}
|
||||
} else if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_GEQ;
|
||||
} else if (lex->at < lex->end && *lex->at == '>') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_RSHIFT;
|
||||
} else {
|
||||
t.kind = TOK_GT;
|
||||
}
|
||||
@@ -176,6 +230,9 @@ Token lex_token(Lexer *lex) {
|
||||
if (lex->at < lex->end && *lex->at == '&') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_AND;
|
||||
} else if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_AND_ASSIGN;
|
||||
} else {
|
||||
t.kind = TOK_BITAND;
|
||||
}
|
||||
@@ -184,11 +241,21 @@ Token lex_token(Lexer *lex) {
|
||||
if (lex->at < lex->end && *lex->at == '|') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_OR;
|
||||
} else if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_OR_ASSIGN;
|
||||
} else {
|
||||
t.kind = TOK_BITOR;
|
||||
}
|
||||
} break;
|
||||
case '^': t.kind = TOK_BITXOR; break;
|
||||
case '^': {
|
||||
if (lex->at < lex->end && *lex->at == '=') {
|
||||
lex_advance(lex);
|
||||
t.kind = TOK_XOR_ASSIGN;
|
||||
} else {
|
||||
t.kind = TOK_BITXOR;
|
||||
}
|
||||
} break;
|
||||
default: {
|
||||
// @todo: lexer perhaps should have a static buffer of size 1024, error message
|
||||
// should be put there and piped to the upper program. The token should be filled
|
||||
|
||||
Reference in New Issue
Block a user