132 lines
2.7 KiB
C
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
|