#ifndef SCIRPT_AST_H #define SCIRPT_AST_H #include "common/generic_array.h" #include "common/string.h" #include "scirpt/position.h" #include #include 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