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_SEMICOLON; break;
|
||||||
case '?': t.kind = TOK_QUESTION; break;
|
case '?': t.kind = TOK_QUESTION; break;
|
||||||
case '#': t.kind = TOK_HASH; break;
|
case '#': t.kind = TOK_HASH; break;
|
||||||
case '+': t.kind = TOK_PLUS; break;
|
case '+': {
|
||||||
case '-': t.kind = TOK_MINUS; break;
|
if (lex->at < lex->end && *lex->at == '+') {
|
||||||
case '*': t.kind = TOK_STAR; break;
|
lex_advance(lex);
|
||||||
case '/': t.kind = TOK_SLASH; break;
|
t.kind = TOK_INC;
|
||||||
case '%': t.kind = TOK_PERCENT; break;
|
} 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 '=': {
|
case '=': {
|
||||||
if (lex->at < lex->end && *lex->at == '=') {
|
if (lex->at < lex->end && *lex->at == '=') {
|
||||||
lex_advance(lex);
|
lex_advance(lex);
|
||||||
@@ -142,23 +186,33 @@ Token lex_token(Lexer *lex) {
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case '<': {
|
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);
|
lex_advance(lex);
|
||||||
t.kind = TOK_LEQ;
|
t.kind = TOK_LEQ;
|
||||||
} else if (lex->at < lex->end && *lex->at == '<') {
|
|
||||||
lex_advance(lex);
|
|
||||||
t.kind = TOK_LSHIFT;
|
|
||||||
} else {
|
} else {
|
||||||
t.kind = TOK_LT;
|
t.kind = TOK_LT;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case '>': {
|
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);
|
lex_advance(lex);
|
||||||
t.kind = TOK_GEQ;
|
t.kind = TOK_GEQ;
|
||||||
} else if (lex->at < lex->end && *lex->at == '>') {
|
|
||||||
lex_advance(lex);
|
|
||||||
t.kind = TOK_RSHIFT;
|
|
||||||
} else {
|
} else {
|
||||||
t.kind = TOK_GT;
|
t.kind = TOK_GT;
|
||||||
}
|
}
|
||||||
@@ -176,6 +230,9 @@ Token lex_token(Lexer *lex) {
|
|||||||
if (lex->at < lex->end && *lex->at == '&') {
|
if (lex->at < lex->end && *lex->at == '&') {
|
||||||
lex_advance(lex);
|
lex_advance(lex);
|
||||||
t.kind = TOK_AND;
|
t.kind = TOK_AND;
|
||||||
|
} else if (lex->at < lex->end && *lex->at == '=') {
|
||||||
|
lex_advance(lex);
|
||||||
|
t.kind = TOK_AND_ASSIGN;
|
||||||
} else {
|
} else {
|
||||||
t.kind = TOK_BITAND;
|
t.kind = TOK_BITAND;
|
||||||
}
|
}
|
||||||
@@ -184,11 +241,21 @@ Token lex_token(Lexer *lex) {
|
|||||||
if (lex->at < lex->end && *lex->at == '|') {
|
if (lex->at < lex->end && *lex->at == '|') {
|
||||||
lex_advance(lex);
|
lex_advance(lex);
|
||||||
t.kind = TOK_OR;
|
t.kind = TOK_OR;
|
||||||
|
} else if (lex->at < lex->end && *lex->at == '=') {
|
||||||
|
lex_advance(lex);
|
||||||
|
t.kind = TOK_OR_ASSIGN;
|
||||||
} else {
|
} else {
|
||||||
t.kind = TOK_BITOR;
|
t.kind = TOK_BITOR;
|
||||||
}
|
}
|
||||||
} break;
|
} 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: {
|
default: {
|
||||||
// @todo: lexer perhaps should have a static buffer of size 1024, error message
|
// @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
|
// should be put there and piped to the upper program. The token should be filled
|
||||||
|
|||||||
Reference in New Issue
Block a user