2025-03-18 10:39:01 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "functions.h"
|
|
|
|
|
#include "globals.h"
|
|
|
|
|
#include "names.h"
|
|
|
|
|
#include "tokenizer.h"
|
|
|
|
|
#include "types.h"
|
|
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
#include <stddef.h>
|
|
|
|
|
|
|
|
|
|
struct expression;
|
|
|
|
|
|
|
|
|
|
typedef struct expressions {
|
|
|
|
|
struct expression *e[256];
|
|
|
|
|
size_t size;
|
|
|
|
|
} expressions;
|
|
|
|
|
|
|
|
|
|
typedef struct expression {
|
|
|
|
|
enum {
|
|
|
|
|
EXPRESSION_BINARY,
|
|
|
|
|
EXPRESSION_UNARY,
|
|
|
|
|
EXPRESSION_BOOLEAN,
|
|
|
|
|
EXPRESSION_FLOAT,
|
|
|
|
|
EXPRESSION_INT,
|
|
|
|
|
// EXPRESSION_STRING,
|
|
|
|
|
EXPRESSION_VARIABLE,
|
|
|
|
|
EXPRESSION_GROUPING,
|
|
|
|
|
EXPRESSION_CALL,
|
2025-04-11 10:06:07 +02:00
|
|
|
EXPRESSION_MEMBER,
|
|
|
|
|
EXPRESSION_ELEMENT,
|
|
|
|
|
EXPRESSION_SWIZZLE
|
2025-03-18 10:39:01 +01:00
|
|
|
} kind;
|
|
|
|
|
|
|
|
|
|
type_ref type;
|
|
|
|
|
|
|
|
|
|
union {
|
|
|
|
|
struct {
|
|
|
|
|
struct expression *left;
|
|
|
|
|
operatorr op;
|
|
|
|
|
struct expression *right;
|
|
|
|
|
} binary;
|
|
|
|
|
struct {
|
|
|
|
|
operatorr op;
|
|
|
|
|
struct expression *right;
|
|
|
|
|
} unary;
|
|
|
|
|
bool boolean;
|
|
|
|
|
double number;
|
|
|
|
|
// char string[MAX_IDENTIFIER_SIZE];
|
|
|
|
|
name_id variable;
|
|
|
|
|
uint32_t index;
|
|
|
|
|
struct expression *grouping;
|
|
|
|
|
struct {
|
|
|
|
|
name_id func_name;
|
|
|
|
|
expressions parameters;
|
|
|
|
|
} call;
|
|
|
|
|
struct {
|
2025-04-11 10:06:07 +02:00
|
|
|
struct expression *of;
|
|
|
|
|
name_id member_name;
|
2025-03-18 10:39:01 +01:00
|
|
|
} member;
|
|
|
|
|
struct {
|
2025-04-11 10:06:07 +02:00
|
|
|
struct expression *of;
|
|
|
|
|
struct expression *element_index;
|
|
|
|
|
} element;
|
|
|
|
|
struct {
|
|
|
|
|
struct expression *of;
|
|
|
|
|
struct swizzle swizz;
|
|
|
|
|
} swizzle;
|
2025-03-18 10:39:01 +01:00
|
|
|
};
|
|
|
|
|
} expression;
|
|
|
|
|
|
|
|
|
|
struct statement;
|
|
|
|
|
|
|
|
|
|
typedef struct statements {
|
|
|
|
|
struct statement *s[256];
|
|
|
|
|
size_t size;
|
|
|
|
|
} statements;
|
|
|
|
|
|
|
|
|
|
typedef struct local_variable {
|
|
|
|
|
name_id name;
|
|
|
|
|
type_ref type;
|
|
|
|
|
uint64_t variable_id;
|
|
|
|
|
} local_variable;
|
|
|
|
|
|
|
|
|
|
typedef struct local_variables {
|
|
|
|
|
local_variable v[256];
|
|
|
|
|
size_t size;
|
|
|
|
|
} local_variables;
|
|
|
|
|
|
|
|
|
|
typedef struct block {
|
|
|
|
|
struct block *parent;
|
|
|
|
|
local_variables vars;
|
|
|
|
|
statements statements;
|
|
|
|
|
} block;
|
|
|
|
|
|
|
|
|
|
typedef struct statement {
|
|
|
|
|
enum {
|
|
|
|
|
STATEMENT_EXPRESSION,
|
|
|
|
|
STATEMENT_RETURN_EXPRESSION,
|
2025-03-25 18:53:04 +01:00
|
|
|
STATEMENT_DISCARD,
|
2025-03-18 10:39:01 +01:00
|
|
|
STATEMENT_IF,
|
|
|
|
|
STATEMENT_WHILE,
|
|
|
|
|
STATEMENT_DO_WHILE,
|
|
|
|
|
STATEMENT_BLOCK,
|
|
|
|
|
STATEMENT_LOCAL_VARIABLE
|
|
|
|
|
} kind;
|
|
|
|
|
|
|
|
|
|
union {
|
|
|
|
|
expression *expression;
|
|
|
|
|
struct {
|
|
|
|
|
expression *test;
|
|
|
|
|
struct statement *if_block;
|
|
|
|
|
expression *else_tests[64];
|
|
|
|
|
struct statement *else_blocks[64];
|
|
|
|
|
uint16_t else_size;
|
|
|
|
|
} iffy;
|
|
|
|
|
struct {
|
|
|
|
|
expression *test;
|
|
|
|
|
struct statement *while_block;
|
|
|
|
|
} whiley;
|
|
|
|
|
block block;
|
|
|
|
|
struct {
|
|
|
|
|
local_variable var;
|
|
|
|
|
expression *init;
|
|
|
|
|
} local_variable;
|
|
|
|
|
};
|
|
|
|
|
} statement;
|
|
|
|
|
|
|
|
|
|
typedef struct definition {
|
|
|
|
|
enum {
|
|
|
|
|
DEFINITION_FUNCTION,
|
|
|
|
|
DEFINITION_STRUCT,
|
2025-06-15 14:58:39 +02:00
|
|
|
DEFINITION_TEX1D,
|
2025-03-18 10:39:01 +01:00
|
|
|
DEFINITION_TEX2D,
|
2025-06-15 14:58:39 +02:00
|
|
|
DEFINITION_TEX3D,
|
2025-03-18 10:39:01 +01:00
|
|
|
DEFINITION_TEXCUBE,
|
2025-06-15 14:58:39 +02:00
|
|
|
DEFINITION_TEX1DARRAY,
|
|
|
|
|
DEFINITION_TEX2DARRAY,
|
|
|
|
|
DEFINITION_TEXCUBEARRAY,
|
2025-03-18 10:39:01 +01:00
|
|
|
DEFINITION_SAMPLER,
|
|
|
|
|
DEFINITION_CONST_CUSTOM,
|
|
|
|
|
DEFINITION_CONST_BASIC,
|
|
|
|
|
DEFINITION_BVH
|
|
|
|
|
} kind;
|
|
|
|
|
|
|
|
|
|
union {
|
|
|
|
|
function_id function;
|
|
|
|
|
global_id global;
|
|
|
|
|
type_id type;
|
|
|
|
|
};
|
|
|
|
|
} definition;
|
|
|
|
|
|
2025-03-25 18:53:04 +01:00
|
|
|
void parse(const char *filename, tokens *tokens);
|