codebased/include/scirpt/ast.h
2023-04-16 04:45:15 +02:00

132 lines
2.7 KiB
C

#ifndef SCIRPT_AST_H
#define SCIRPT_AST_H
#include "common/generic_array.h"
#include "common/string.h"
#include "scirpt/position.h"
#include <stdbool.h>
#include <stdint.h>
typedef enum {
ScirptAstExprTypeEof,
ScirptAstExprTypeError,
ScirptAstExprTypeId,
ScirptAstExprTypeInt,
ScirptAstExprTypeFloat,
ScirptAstExprTypeString,
ScirptAstExprTypeNull,
ScirptAstExprTypeBool,
ScirptAstExprTypeBlock,
ScirptAstExprTypeIf,
ScirptAstExprTypeMember,
ScirptAstExprTypeCall,
ScirptAstExprTypeIndex,
ScirptAstExprTypeUnary,
ScirptAstExprTypeBinary,
ScirptAstExprTypeAssign,
ScirptAstExprTypeLet,
} ScirptAstExprType;
typedef struct ScirptAstExpr ScirptAstExpr;
GENERIC_ARRAY(ScirptAstExpr*, ScirptAstExprArray, scirpt_ast_expr_array)
typedef struct {
ScirptAstExprArray statements;
} ScirptAstExprBlock;
typedef struct {
ScirptAstExpr* condition;
ScirptAstExpr* truthy;
ScirptAstExpr* falsy;
} ScirptAstExprIf;
typedef struct {
ScirptAstExpr* subject;
HeapString value;
} ScirptAstExprMember;
typedef struct {
ScirptAstExpr* subject;
ScirptAstExprArray args;
} ScirptAstExprCall;
typedef struct {
ScirptAstExpr* subject;
ScirptAstExpr* value;
} ScirptAstExprIndex;
typedef enum {
ScirptAstExprUnaryTypeNot,
ScirptAstExprUnaryTypeNegate,
} ScirptAstExprUnaryType;
typedef struct {
ScirptAstExprUnaryType type;
ScirptAstExpr* subject;
} ScirptAstExprUnary;
typedef enum {
ScirptAstExprBinaryTypeAdd,
ScirptAstExprBinaryTypeSubtract,
ScirptAstExprBinaryTypeMultiply,
ScirptAstExprBinaryTypeDivide,
ScirptAstExprBinaryTypeModulo,
ScirptAstExprBinaryTypeEqual,
ScirptAstExprBinaryTypeInequal,
ScirptAstExprBinaryTypeLt,
ScirptAstExprBinaryTypeGt,
ScirptAstExprBinaryTypeLtEqual,
ScirptAstExprBinaryTypeGtEqual,
} ScirptAstExprBinaryType;
typedef struct {
ScirptAstExprBinaryType type;
ScirptAstExpr* left;
ScirptAstExpr* right;
} ScirptAstExprBinary;
typedef enum {
ScirptAstExprAssignTypeAssign,
ScirptAstExprAssignTypeAdd,
ScirptAstExprAssignTypeSubtract,
ScirptAstExprAssignTypeMultiply,
ScirptAstExprAssignTypeDivide,
ScirptAstExprAssignTypeModulo,
} ScirptAstExprAssignType;
typedef struct {
ScirptAstExpr* subject;
ScirptAstExpr* value;
} ScirptAstExprAssign;
typedef struct {
HeapString subject;
ScirptAstExpr* value;
} ScirptAstExprLet;
struct ScirptAstExpr {
ScirptAstExprType type;
ScirptPosition pos;
union {
HeapString id_value;
int64_t int_value;
double float_value;
HeapString string_value;
bool bool_value;
ScirptAstExprBlock block;
ScirptAstExprIf if_expr;
ScirptAstExprMember member;
ScirptAstExprCall call;
ScirptAstExprIndex index;
ScirptAstExprUnary unary;
ScirptAstExprBinary binary;
// assign
// let
};
};
void scirpt_ast_expr_delete(ScirptAstExpr* expr);
#endif