parser_internal.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #ifndef __sti_parser_internal_h__
  2. #define __sti_parser_internal_h__
  3. #include "parser.h"
  4. #define C_PARSER_STRING_CACHE_LIST \
  5. X(_comma, ",") \
  6. X(_star, "*") \
  7. X(_semi, ";") \
  8. X(_dquote, "\"") \
  9. X(_elipsis, "...") \
  10. X(_else, "else") \
  11. X(_enum, "enum") \
  12. X(_eq, "=") \
  13. X(_eqeq, "==") \
  14. X(_gt, ">") \
  15. X(_hash, "#") \
  16. X(_if, "if") \
  17. X(_lbrace, "{") \
  18. X(_rbrace, "}") \
  19. X(_lbracket, "[") \
  20. X(_rbracket, "]") \
  21. X(_lparen, "(") \
  22. X(_lt, "<") \
  23. X(_rparen, ")") \
  24. X(_struct, "struct") \
  25. X(_union, "union") \
  26. PARSER_TYPESPEC_LIST(Y) \
  27. BUILTIN_TYPE_LIST(Y) \
  28. #define STACK_ITEM_TYPE_LIST \
  29. X(TYPE_SPEC) \
  30. #define PARSER_STATE_LIST \
  31. X(TYPEDEF) \
  32. X(TYPEDEC) \
  33. X(TYPEDEC_ARRAY_DIM) \
  34. X(STRUCT) \
  35. X(STRUCT_IDENT) \
  36. X(STRUCT_IDENT_VAR) \
  37. X(STRUCT_DEF) \
  38. X(UNION) \
  39. X(UNION_IDENT) \
  40. X(UNION_IDENT_VAR) \
  41. X(UNION_DEF) \
  42. #define BUILTIN_TYPE_LIST(X) \
  43. X(void) \
  44. X(char) \
  45. X(int) \
  46. X(float) \
  47. X(double) \
  48. X(_Bool) \
  49. X(wchar_t) \
  50. X(uint8_t) \
  51. X(uint16_t) \
  52. X(uint32_t) \
  53. X(uint64_t) \
  54. X(int8_t) \
  55. X(int16_t) \
  56. X(int32_t) \
  57. X(int64_t) \
  58. // TODO simd intrinsics?
  59. #define PARSER_TYPESPEC_LIST(X) \
  60. X(short) \
  61. X(long) \
  62. X(unsigned) \
  63. X(signed) \
  64. X(volatile) \
  65. X(const) \
  66. X(static) \
  67. X(extern) \
  68. X(register) \
  69. X(auto) \
  70. X(typedef) \
  71. /*
  72. #define PARSER_TYPESPEC_LIST(X) \
  73. X(void) \
  74. X(char) \
  75. X(short) \
  76. X(int) \
  77. X(long) \
  78. X(float) \
  79. X(double) \
  80. X(_Bool) \
  81. */
  82. #define Y(a) X(_##a, #a)
  83. enum {
  84. #define X(a, ...) TYPESPEC_ORD_##a,
  85. PARSER_TYPESPEC_LIST(X)
  86. #undef X
  87. };
  88. enum {
  89. #define X(a, ...) TYPESPEC_##a = 1 << TYPESPEC_ORD_##a,
  90. PARSER_TYPESPEC_LIST(X)
  91. #undef X
  92. };
  93. typedef struct {
  94. char type; // s, e, u, [b]uiltin
  95. lexer_token_t* name; // NULL for anonymous structs
  96. union {
  97. ast_struct_def_t* stdef;
  98. // union
  99. // enum
  100. };
  101. } ast_typename_t;
  102. typedef struct stack_state {
  103. int id;
  104. char has_typedef;
  105. int stars;
  106. VEC(lexer_token_t*) type_specs;
  107. VEC(ast_typename_t) type_names;
  108. VEC(lexer_token_t*) idents;
  109. VEC(unsigned long) array_dims;
  110. } stack_state_t;
  111. typedef struct cp_ctx {
  112. cpp_tu_t* cpp;
  113. struct string_internment_table* str_table;
  114. cpp_token_list_t* tokens;
  115. VEC(stack_state_t) stack;
  116. VEC(stack_state_t) state_stack;
  117. stack_state_t* state;
  118. ast_tu_t* tu;
  119. #define X(a, b, ...) char* a;
  120. C_PARSER_STRING_CACHE_LIST
  121. #undef X
  122. } cp_ctx_t;
  123. void ast_tu_init(cp_ctx_t* ctx, ast_tu_t* tu);
  124. ast_symbol_t* lookup_typename(ast_tu_t* tu, lexer_token_t* t);
  125. void cp_ctx_destroy_state(stack_state_t* st);
  126. ast_type_t* cp_ctx_process_type(cp_ctx_t* ctx);
  127. int eat_typespecs(cp_ctx_t* ctx, long* tn);
  128. #endif // __sti_parser_internal_h__