Add some preprocessor magic

This commit is contained in:
Ilya Bezrukov 2024-10-17 14:05:56 +03:00
parent 9e39e9d017
commit 030cbfe481

37
main.c
View File

@ -14,25 +14,36 @@ F ::= (E)|i
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#define fatal(...) { eprintf(__VA_ARGS__); putc('\n', stderr); exit(1); }
#define ENUM(x) x,
#define STR(x) #x,
#define __TokenType(f) \
f(EMPTY) \
f(INTEGER) \
f(PLUS) \
f(MULT) \
f(LBRACE) \
f(RBRACE) \
f(LF) \
f(EF) \
typedef enum TokenType {
INTEGER = 1,
PLUS = 2,
MULT = 4,
LBRACE = 8,
RBRACE = 16,
LF = 32,
EF = 64,
__TokenType(ENUM)
} TokenType;
const char *TokenTypeStr[] = {
__TokenType(STR)
};
typedef struct _Token {
TokenType type;
int value;
} Token;
void fatal(const char* message);
Token scan();
int e();
@ -90,8 +101,7 @@ Token scan() {
token.type = LF; break;
case EOF: token.type = EF; break;
default:
eprintf("'%c' (%d)\n", s, s);
fatal("Unexpected symbol");
fatal("Unexpected symbol: '%c' (%X)", s, s);
break;
}
return token;
@ -134,13 +144,8 @@ int f() {
fatal("Unexpected EOF");
}
else {
fatal("Unexpected token");
fatal("Unexpected token: %s (%d)", TokenTypeStr[current.type], current.type);
}
current = scan();
return result;
}
void fatal(const char* message) {
eprintf("Error: %s\n", message);
exit(1);
}