parser.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #pragma once
  2. #include "functions.h"
  3. #include "globals.h"
  4. #include "names.h"
  5. #include "tokenizer.h"
  6. #include "types.h"
  7. #include <stdbool.h>
  8. #include <stddef.h>
  9. struct expression;
  10. typedef struct expressions {
  11. struct expression *e[256];
  12. size_t size;
  13. } expressions;
  14. typedef struct expression {
  15. enum {
  16. EXPRESSION_BINARY,
  17. EXPRESSION_UNARY,
  18. EXPRESSION_BOOLEAN,
  19. EXPRESSION_FLOAT,
  20. EXPRESSION_INT,
  21. // EXPRESSION_STRING,
  22. EXPRESSION_VARIABLE,
  23. EXPRESSION_GROUPING,
  24. EXPRESSION_CALL,
  25. EXPRESSION_MEMBER,
  26. EXPRESSION_ELEMENT,
  27. EXPRESSION_SWIZZLE
  28. } kind;
  29. type_ref type;
  30. union {
  31. struct {
  32. struct expression *left;
  33. operatorr op;
  34. struct expression *right;
  35. } binary;
  36. struct {
  37. operatorr op;
  38. struct expression *right;
  39. } unary;
  40. bool boolean;
  41. double number;
  42. // char string[MAX_IDENTIFIER_SIZE];
  43. name_id variable;
  44. uint32_t index;
  45. struct expression *grouping;
  46. struct {
  47. name_id func_name;
  48. expressions parameters;
  49. } call;
  50. struct {
  51. struct expression *of;
  52. name_id member_name;
  53. } member;
  54. struct {
  55. struct expression *of;
  56. struct expression *element_index;
  57. } element;
  58. struct {
  59. struct expression *of;
  60. struct swizzle swizz;
  61. } swizzle;
  62. };
  63. } expression;
  64. struct statement;
  65. typedef struct statements {
  66. struct statement *s[256];
  67. size_t size;
  68. } statements;
  69. typedef struct local_variable {
  70. name_id name;
  71. type_ref type;
  72. uint64_t variable_id;
  73. } local_variable;
  74. typedef struct local_variables {
  75. local_variable v[256];
  76. size_t size;
  77. } local_variables;
  78. typedef struct block {
  79. struct block *parent;
  80. local_variables vars;
  81. statements statements;
  82. } block;
  83. typedef struct statement {
  84. enum {
  85. STATEMENT_EXPRESSION,
  86. STATEMENT_RETURN_EXPRESSION,
  87. STATEMENT_DISCARD,
  88. STATEMENT_IF,
  89. STATEMENT_WHILE,
  90. STATEMENT_DO_WHILE,
  91. STATEMENT_BLOCK,
  92. STATEMENT_LOCAL_VARIABLE
  93. } kind;
  94. union {
  95. expression *expression;
  96. struct {
  97. expression *test;
  98. struct statement *if_block;
  99. expression *else_tests[64];
  100. struct statement *else_blocks[64];
  101. uint16_t else_size;
  102. } iffy;
  103. struct {
  104. expression *test;
  105. struct statement *while_block;
  106. } whiley;
  107. block block;
  108. struct {
  109. local_variable var;
  110. expression *init;
  111. } local_variable;
  112. };
  113. } statement;
  114. typedef struct definition {
  115. enum {
  116. DEFINITION_FUNCTION,
  117. DEFINITION_STRUCT,
  118. DEFINITION_TEX1D,
  119. DEFINITION_TEX2D,
  120. DEFINITION_TEX3D,
  121. DEFINITION_TEXCUBE,
  122. DEFINITION_TEX1DARRAY,
  123. DEFINITION_TEX2DARRAY,
  124. DEFINITION_TEXCUBEARRAY,
  125. DEFINITION_SAMPLER,
  126. DEFINITION_CONST_CUSTOM,
  127. DEFINITION_CONST_BASIC,
  128. DEFINITION_BVH
  129. } kind;
  130. union {
  131. function_id function;
  132. global_id global;
  133. type_id type;
  134. };
  135. } definition;
  136. void parse(const char *filename, tokens *tokens);