String literals, proper compound statement parsing.
[mcc.git] / scanner.h
blobdf8a04cb88beaee77763513973ea321b0bba23bc
1 #ifndef MCC_SCANNER_H
2 #define MCC_SCANNER_H
4 #include "cpp.h"
6 typedef int tok_t;
8 #define IDENT_HASH_SIZE 64
10 struct ident {
11 struct ident *hash_prev;
12 tok_t tok;
13 char str[1];
16 struct lexer {
17 struct cpp cpp;
18 char *pch;
19 tok_t tok;
20 char *tok_str;
21 int tok_str_len;
22 struct sloc tok_sloc;
23 int next_ident_tok;
24 struct ident *ident_hashtab[IDENT_HASH_SIZE];
27 void lex_create(struct lexer *lex);
28 void lex_delete(struct lexer *lex);
29 void lex_next(struct lexer *lex);
30 char *lex_get_tok_str(struct lexer *lex, tok_t tok, char *tok_str);
31 void lex_start(struct lexer *lex);
32 bool lex_is_ident(struct lexer *lex, tok_t tok);
34 // Token numbers
35 #include "tokens.inc"
36 enum {
37 TOK_FIRSTK = 0x200,
38 #define DEF(x) TOK_ ## x,
39 #include "tokens.inc"
40 #undef DEF
41 TOK_LASTK,
43 enum {
44 TOK_FIRST_PUNCT = 0x100,
45 #define PUNCT(x, str) TOK_ ## x,
46 #include "tokens.inc"
47 #undef PUNCT
48 TOK_LAST_PUNCT,
51 #endif