Advertisement
Tkap1

Untitled

Aug 6th, 2023
906
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.10 KB | None | 0 0
  1.  
  2. enum e_node
  3. {
  4.     e_node_invalid,
  5.     e_node_func_call,
  6.     e_node_integer,
  7.     e_node_float,
  8.     e_node_identifier,
  9.     e_node_var_decl,
  10.     e_node_for,
  11.     e_node_compound,
  12.     e_node_plus_equals,
  13.     e_node_minus_equals,
  14.     e_node_times_equals,
  15.     e_node_add,
  16.     e_node_subtract,
  17.     e_node_multiply,
  18.     e_node_divide,
  19.     e_node_mod,
  20.     e_node_assign,
  21.     e_node_if,
  22.     e_node_equals,
  23.     e_node_not_equals,
  24.     e_node_greater_than_or_equal,
  25.     e_node_less_than_or_equal,
  26.     e_node_greater_than,
  27.     e_node_less_than,
  28.     e_node_return,
  29.     e_node_func_decl,
  30.     e_node_func_arg,
  31.     e_node_break,
  32.     e_node_continue,
  33.     e_node_type,
  34.     e_node_possible_type,
  35.     e_node_str,
  36.     e_node_unary,
  37.     e_node_struct,
  38.     e_node_struct_member,
  39.     e_node_member_access,
  40. };
  41.  
  42. enum e_unary
  43. {
  44.     e_unary_dereference,
  45.     e_unary_address_of,
  46.     e_unary_logical_not,
  47.     e_unary_cast,
  48. };
  49.  
  50. struct s_node;
  51. struct s_type_check_var
  52. {
  53.     int pointer_level;
  54.     int stack_offset; // @Note(tkap, 28/07/2023): This is relative to the function
  55.     s_node* func_node;
  56.     s_node* type_node;
  57.     s64 id;
  58.     s_str<64> name;
  59. };
  60.  
  61. struct s_type_instance
  62. {
  63.     int pointer_level;
  64.     s_node* type;
  65. };
  66.  
  67. struct s_node
  68. {
  69.     int line;
  70.     e_node type;
  71.     s_node* next;
  72.  
  73.     int stack_offset;
  74.     int pointer_level;
  75.     s_node* type_node;
  76.     s_node* func_node;
  77.  
  78.     union
  79.     {
  80.         struct
  81.         {
  82.             int arg_count;
  83.             s_node* left;
  84.             s_node* args;
  85.         } func_call;
  86.  
  87.         struct
  88.         {
  89.             int bytes_used_by_local_variables;
  90.             int bytes_used_by_args;
  91.             s64 id;
  92.             b8 external;
  93.             int arg_count;
  94.             s_str<64> dll_str;
  95.             s_str<64> name;
  96.             s_node* return_type;
  97.             s_node* args;
  98.             s_node* body;
  99.         } func_decl;
  100.  
  101.         struct
  102.         {
  103.             s64 val;
  104.         } integer;
  105.  
  106.         struct
  107.         {
  108.             float val;
  109.         } nfloat;
  110.  
  111.         struct
  112.         {
  113.             int bytes_used_by_members;
  114.             int member_count;
  115.             s_node* members;
  116.             s_str<64> name;
  117.         } nstruct;
  118.  
  119.         struct
  120.         {
  121.             s_node* type;
  122.             s_str<64> name;
  123.         } struct_member;
  124.  
  125.         struct
  126.         {
  127.             // @TODO(tkap, 26/07/2023): This needs to be dynamic
  128.             s_str<128> val;
  129.         } str;
  130.  
  131.         struct
  132.         {
  133.             s_str<64> name;
  134.             s_node* type;
  135.             s_node* val;
  136.         } var_decl;
  137.  
  138.         struct
  139.         {
  140.             s_str<64> name;
  141.         } identifier;
  142.  
  143.         struct
  144.         {
  145.             b8 reverse;
  146.             s_str<64> name;
  147.             s_node* expr;
  148.             s_node* body;
  149.         } nfor;
  150.  
  151.         struct
  152.         {
  153.             s_node* expr;
  154.             s_node* body;
  155.         } nif;
  156.  
  157.         struct
  158.         {
  159.             int statement_count;
  160.             s_node* statements;
  161.         } compound;
  162.  
  163.         struct
  164.         {
  165.             s_node* left;
  166.             s_node* right;
  167.         } arithmetic;
  168.  
  169.         struct
  170.         {
  171.             s_node* expr;
  172.         } nreturn;
  173.  
  174.         struct
  175.         {
  176.             int size_in_bytes;
  177.             int id;
  178.             s_str<64> name;
  179.         } ntype;
  180.  
  181.         struct
  182.         {
  183.             int pointer_level;
  184.             s_str<64> name;
  185.         } possible_type;
  186.  
  187.         struct
  188.         {
  189.             s_node* type;
  190.             s_str<64> name;
  191.         } func_arg;
  192.  
  193.         struct
  194.         {
  195.             e_unary type;
  196.             s_node* cast_type; // @Note(tkap, 04/08/2023): Only for e_unary_cast
  197.             s_node* expr;
  198.         } unary;
  199.  
  200.         struct
  201.         {
  202.             int val;
  203.         } nbreak;
  204.     };
  205. };
  206.  
  207.  
  208. struct s_parse_result
  209. {
  210.     b8 success;
  211.     s_tokenizer tokenizer;
  212.     s_node node;
  213. };
  214.  
  215. struct s_error_reporter
  216. {
  217.     b8 has_error;
  218.     b8 has_warning;
  219.     char error_str[1024];
  220.  
  221.     void warning(int line, char* file, char* str, ...);
  222.     void error(int line, char* file, char* str, ...);
  223.     void fatal(int line, char* file, char* str, ...);
  224. };
  225.  
  226.  
  227. func s_node* parse(s_tokenizer tokenizer, char* file);
  228. func s_parse_result parse_expr(s_tokenizer tokenizer, int operator_level, s_error_reporter* reporter, char* file);
  229. func s_parse_result parse_statement(s_tokenizer tokenizer, s_error_reporter* reporter, char* file);
  230. func s_node* make_node(s_node node);
  231. func s_node** node_set_and_advance(s_node** target, s_node node);
  232. func int get_operator_level(char* str);
  233. func void print_parser_expr(s_node* node);
  234. func b8 peek_assignment_token(s_tokenizer tokenizer, e_node* out_type);
  235. func s_parse_result parse_type(s_tokenizer tokenizer, s_error_reporter* reporter, char* file);
  236. func s_parse_result parse_func_decl(s_tokenizer tokenizer, s_error_reporter* reporter, char* file);
  237. func int get_unary_operator_level(char* str);
  238. func b8 token_is_keyword(s_token token);
  239. func s_parse_result parse_struct(s_tokenizer tokenizer, s_error_reporter* reporter, char* file);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement