diff --git a/main.c b/main.c index 4ec669a..6b0e488 100644 --- a/main.c +++ b/main.c @@ -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); -}