#ifndef SCIRPT_AST_H #define SCIRPT_AST_H #include "common/generic_array.h" #include "common/string.h" #include "common/string_array.h" #include "scirpt/position.h" #include #include typedef enum { ScirptAstExprTypeEof, ScirptAstExprTypeError, ScirptAstExprTypeId, ScirptAstExprTypeInt, ScirptAstExprTypeFloat, ScirptAstExprTypeString, ScirptAstExprTypeNull, ScirptAstExprTypeBool, ScirptAstExprTypeBlock, ScirptAstExprTypeIf, ScirptAstExprTypeLoop, ScirptAstExprTypeWhile, ScirptAstExprTypeFor, ScirptAstExprTypeMember, ScirptAstExprTypeCall, ScirptAstExprTypeIndex, ScirptAstExprTypeUnary, ScirptAstExprTypeBinary, ScirptAstExprTypeAssign, ScirptAstExprTypeLambda, ScirptAstExprTypeFunction, ScirptAstExprTypeLet, ScirptAstExprTypeReturn, ScirptAstExprTypeBreak, } 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* body; } ScirptAstExprLoop; typedef struct { ScirptAstExpr* condition; ScirptAstExpr* body; } ScirptAstExprWhile; typedef struct { HeapString subject; ScirptAstExpr* value; ScirptAstExpr* body; } ScirptAstExprFor; 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, ScirptAstExprBinaryTypeExponent, ScirptAstExprBinaryTypeLt, ScirptAstExprBinaryTypeGt, ScirptAstExprBinaryTypeLtEqual, ScirptAstExprBinaryTypeGtEqual, ScirptAstExprBinaryTypeIn, ScirptAstExprBinaryTypeEqual, ScirptAstExprBinaryTypeInequal, ScirptAstExprBinaryTypeAnd, ScirptAstExprBinaryTypeOr, } ScirptAstExprBinaryType; typedef struct { ScirptAstExprBinaryType type; ScirptAstExpr* left; ScirptAstExpr* right; } ScirptAstExprBinary; typedef enum { ScirptAstExprAssignTypeEqual, ScirptAstExprAssignTypeAdd, ScirptAstExprAssignTypeSubtract, ScirptAstExprAssignTypeMultiply, ScirptAstExprAssignTypeDivide, ScirptAstExprAssignTypeModulo, ScirptAstExprAssignTypeExponent, } ScirptAstExprAssignType; typedef struct { ScirptAstExprAssignType type; ScirptAstExpr* subject; ScirptAstExpr* value; } ScirptAstExprAssign; typedef struct { HeapStringArray params; ScirptAstExpr* body; } ScirptAstExprLambda; typedef struct { HeapString subject; HeapStringArray params; ScirptAstExpr* body; } ScirptAstExprFunction; typedef struct { HeapString subject; ScirptAstExpr* value; } ScirptAstExprLet; typedef struct { ScirptAstExpr* value; } ScirptAstExprReturn; typedef struct { ScirptAstExpr* value; } ScirptAstExprBreak; 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; ScirptAstExprLoop loop; ScirptAstExprWhile while_expr; ScirptAstExprFor for_expr; ScirptAstExprMember member; ScirptAstExprCall call; ScirptAstExprIndex index; ScirptAstExprUnary unary; ScirptAstExprBinary binary; ScirptAstExprAssign assign; ScirptAstExprLambda lambda; ScirptAstExprFunction function; ScirptAstExprLet let; ScirptAstExprReturn return_statement; ScirptAstExprBreak break_statement; }; }; void scirpt_ast_expr_delete(ScirptAstExpr* expr); #endif