lex.h (1544B)
1 /* 2 * lex.h -- lexer interface 3 */ 4 5 #ifndef LEX_H 6 #define LEX_H 7 8 #include <stddef.h> 9 #include <stdint.h> 10 11 #define MAX_LEXEME_SIZE 256 12 #define MAX_PATH_SIZE 1024 13 14 enum toktype { 15 TOK_EOF, 16 17 TOK_CLASS, 18 TOK_FC, 19 TOK_IMPORT, 20 TOK_AS, 21 22 TOK_F32, 23 TOK_F64, 24 TOK_I8, 25 TOK_I16, 26 TOK_I32, 27 TOK_I64, 28 TOK_U8, 29 TOK_U16, 30 TOK_U32, 31 TOK_U64, 32 33 TOK_IDENT, 34 35 TOK_LBRACE, 36 TOK_RBRACE, 37 TOK_LPAREN, 38 TOK_RPAREN, 39 TOK_COMMA, 40 TOK_PERIOD, 41 42 TOK_UNKNOWN 43 }; 44 45 struct tok { 46 enum toktype type; 47 char lexeme[64]; 48 }; 49 50 struct keyword { 51 const char *name; 52 enum toktype type; 53 }; 54 55 typedef enum toktype toktype_t; 56 typedef struct tok tok_t; 57 typedef struct keyword keyword_t; 58 59 static const keyword_t kws[] = { 60 {"import", TOK_IMPORT}, 61 {"class", TOK_CLASS}, 62 {"fc", TOK_FC}, 63 {"as", TOK_AS}, 64 65 {"f32", TOK_F32}, 66 {"f64", TOK_F64}, 67 68 {"i8", TOK_I8}, 69 {"i16", TOK_I16}, 70 {"i32", TOK_I32}, 71 {"i64", TOK_I64}, 72 73 {"u8", TOK_U8}, 74 {"u16", TOK_U16}, 75 {"u32", TOK_U32}, 76 {"u64", TOK_U64}, 77 }; 78 79 /* state defined in lex.c */ 80 extern const char *src; 81 extern size_t i; 82 83 toktype_t lu_kw(const char *str); 84 85 int peek(void); 86 int consume(void); 87 88 void s_ws(void); 89 void s_lc(void); 90 void s_bc(void); 91 92 void lex_init(void); 93 94 tok_t id(void); 95 tok_t nexttok(void); 96 97 const char *tokname(toktype_t t); 98 99 void push_token(tok_t t); 100 tok_t pop_token(void); 101 tok_t peek_stack(void); 102 103 #endif /* LEX_H */ 104