lexer.h 939 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #ifndef __c_lexer_h__
  2. #define __c_lexer_h__
  3. #define LEXER_TOKEN_TYPE_LIST \
  4. X(INVALID) \
  5. X(COMMENT) \
  6. X(NUMBER) \
  7. X(SPACE) \
  8. X(CONST) \
  9. X(IDENT) \
  10. X(PUNCT) \
  11. X(STRING) \
  12. enum {
  13. #define X(a) LEXER_TOK_##a,
  14. LEXER_TOKEN_TYPE_LIST
  15. #undef X
  16. };
  17. extern char* lexer_token_type_names[];
  18. typedef struct lexer_source {
  19. size_t len;
  20. char* text;
  21. char* head;
  22. } lexer_source_t;
  23. struct cpp_file;
  24. typedef struct lexer_token {
  25. int type;
  26. char has_newline; // lexically speaking. escaped newlines don't count.
  27. int start_line;
  28. int start_col;
  29. int end_line;
  30. int end_col;
  31. size_t source_adv; // number of bytes consumed from the input
  32. size_t len; // length of the output token
  33. size_t alloc; // allocated size of the token buffer
  34. char* text; // the token text
  35. struct cpp_file* file;
  36. } lexer_token_t;
  37. int is_token(lexer_source_t* src, lexer_token_t* t);
  38. int is_token_slow(lexer_source_t* src, lexer_token_t* t);
  39. #endif