X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Usermode%2FLibraries%2Flibspiderscript.so_src%2Fast.h;h=a6620fc2700c29be44b1236433a1e313e3f7e4d2;hb=da93bf59c8d6d7cd4a5547f444197abf0490d399;hp=06d3333354d3f01d646be537f5f1a0c6c504b0a2;hpb=d2ef25f69dfb16c2510a9b305b6fa288548af8bc;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libspiderscript.so_src/ast.h b/Usermode/Libraries/libspiderscript.so_src/ast.h index 06d33333..a6620fc2 100644 --- a/Usermode/Libraries/libspiderscript.so_src/ast.h +++ b/Usermode/Libraries/libspiderscript.so_src/ast.h @@ -22,18 +22,24 @@ enum eAST_NodeTypes NODETYPE_BLOCK, //!< Node Block + // 2 NODETYPE_VARIABLE, //!< Variable NODETYPE_CONSTANT, //!< Runtime Constant NODETYPE_STRING, //!< String Constant NODETYPE_INTEGER, //!< Integer Constant NODETYPE_REAL, //!< Real Constant + NODETYPE_NULL, + // 8 NODETYPE_DEFVAR, //!< Define a variable (Variable) NODETYPE_SCOPE, //!< Dereference a Namespace/Class static NODETYPE_ELEMENT, //!< Reference a class attribute NODETYPE_CAST, //!< Cast a value to another (Uniop) + // 12 NODETYPE_RETURN, //!< Return from a function (reserved word) + NODETYPE_BREAK, //!< Break out of a loop + NODETYPE_CONTINUE, //!< Next loop iteration NODETYPE_ASSIGN, //!< Variable assignment operator NODETYPE_POSTINC, //!< Post-increment (i++) - Uniop NODETYPE_POSTDEC, //!< Post-decrement (i--) - Uniop @@ -41,17 +47,21 @@ enum eAST_NodeTypes NODETYPE_METHODCALL, //!< Call a class method NODETYPE_CREATEOBJECT, //!< Create an object + // 21 NODETYPE_IF, //!< Conditional NODETYPE_LOOP, //!< Looping Construct + // 23 NODETYPE_INDEX, //!< Index into an array + // 24 NODETYPE_LOGICALNOT, //!< Logical NOT operator NODETYPE_LOGICALAND, //!< Logical AND operator NODETYPE_LOGICALOR, //!< Logical OR operator NODETYPE_LOGICALXOR, //!< Logical XOR operator NODETYPE_EQUALS, //!< Comparison Equals + NODETYPE_NOTEQUALS, //!< Comparison Not Equals NODETYPE_LESSTHAN, //!< Comparison Less Than NODETYPE_LESSTHANEQUAL, //!< Comparison Less Than or Equal NODETYPE_GREATERTHAN, //!< Comparison Greater Than @@ -74,35 +84,11 @@ enum eAST_NodeTypes NODETYPE_MODULO, //!< Modulus }; -struct sSpiderScript -{ - tSpiderVariant *Variant; - tAST_Script *Script; - char *CurNamespace; //!< Current namespace prefix (NULL = Root) - No trailing . -}; - -struct sAST_Script -{ - // TODO: Namespaces and Classes - tAST_Function *Functions; - tAST_Function *LastFunction; -}; - -struct sAST_Function -{ - tAST_Function *Next; //!< Next function in list - int ReturnType; - tAST_Node *Code; //!< Function Code - tAST_Node *Arguments; // HACKJOB (Only NODETYPE_DEFVAR is allowed) - tAST_Node *Arguments_Last; - char Name[]; //!< Function Name -}; - struct sAST_Node { tAST_Node *NextSibling; tAST_NodeType Type; - + const char *File; int Line; @@ -152,11 +138,11 @@ struct sAST_Node tAST_Node *Condition; tAST_Node *Increment; tAST_Node *Code; + char Tag[]; } For; /** - * \note Used for \a NODETYPE_VARIABLE, \a NODETYPE_CONSTANT and - * \a NODETYPE_SCOPE + * \note Used for \a NODETYPE_VARIABLE and \a NODETYPE_CONSTANT */ struct { char _unused; // Shut GCC up @@ -170,8 +156,6 @@ struct sAST_Node struct { int DataType; - tAST_Node *LevelSizes; - tAST_Node *LevelSizes_Last; tAST_Node *InitialValue; char Name[]; } DefVar; @@ -197,7 +181,9 @@ struct sAST_BlockState tSpiderValue *RetVal; tSpiderNamespace *BaseNamespace; //!< Base namespace (for entire block) tSpiderNamespace *CurNamespace; //!< Currently selected namespace - int Ident; + int Ident; //!< ID number used for variable lookup caching + const char *BreakTarget; + int BreakType; }; struct sAST_Variable @@ -210,18 +196,18 @@ struct sAST_Variable // === FUNCTIONS === extern tAST_Script *AST_NewScript(void); -extern size_t AST_WriteScript(void *Buffer, tAST_Script *Script); +extern size_t AST_WriteScript(void *Buffer, tSpiderScript *Script); extern size_t AST_WriteNode(void *Buffer, size_t Offset, tAST_Node *Node); -extern tAST_Function *AST_AppendFunction(tAST_Script *Script, const char *Name, int ReturnType); -extern void AST_AppendFunctionArg(tAST_Function *Function, tAST_Node *Arg); -extern void AST_SetFunctionCode(tAST_Function *Function, tAST_Node *Root); +extern int AST_AppendFunction(tSpiderScript *Script, const char *Name, int ReturnType, tAST_Node *FirstArg, tAST_Node *Code); extern tAST_Node *AST_NewNop(tParser *Parser); extern tAST_Node *AST_NewString(tParser *Parser, const char *String, int Length); extern tAST_Node *AST_NewInteger(tParser *Parser, int64_t Value); extern tAST_Node *AST_NewReal(tParser *Parser, double Value); +extern tAST_Node *AST_NewNull(tParser *Parser); + extern tAST_Node *AST_NewVariable(tParser *Parser, const char *Name); extern tAST_Node *AST_NewDefineVar(tParser *Parser, int Type, const char *Name); extern tAST_Node *AST_NewConstant(tParser *Parser, const char *Name); @@ -236,12 +222,13 @@ extern tAST_Node *AST_NewCodeBlock(tParser *Parser); extern void AST_AppendNode(tAST_Node *Parent, tAST_Node *Child); extern tAST_Node *AST_NewIf(tParser *Parser, tAST_Node *Condition, tAST_Node *True, tAST_Node *False); -extern tAST_Node *AST_NewLoop(tParser *Parser, tAST_Node *Init, int bPostCheck, tAST_Node *Condition, tAST_Node *Increment, tAST_Node *Code); +extern tAST_Node *AST_NewLoop(tParser *Parser, const char *Tag, tAST_Node *Init, int bPostCheck, tAST_Node *Condition, tAST_Node *Increment, tAST_Node *Code); extern tAST_Node *AST_NewAssign(tParser *Parser, int Operation, tAST_Node *Dest, tAST_Node *Value); extern tAST_Node *AST_NewCast(tParser *Parser, int Target, tAST_Node *Value); extern tAST_Node *AST_NewBinOp(tParser *Parser, int Operation, tAST_Node *Left, tAST_Node *Right); extern tAST_Node *AST_NewUniOp(tParser *Parser, int Operation, tAST_Node *Value); +extern tAST_Node *AST_NewBreakout(tParser *Parser, int Type, const char *DestTag); extern tAST_Node *AST_NewScopeDereference(tParser *Parser, const char *Name, tAST_Node *Child); extern void AST_FreeNode(tAST_Node *Node); @@ -250,5 +237,9 @@ extern void AST_FreeNode(tAST_Node *Node); extern void Object_Dereference(tSpiderValue *Object); extern void Object_Reference(tSpiderValue *Object); extern tSpiderValue *AST_ExecuteNode(tAST_BlockState *Block, tAST_Node *Node); +extern tSpiderValue *AST_ExecuteNode_BinOp(tSpiderScript *Script, tAST_Node *Node, int Operation, tSpiderValue *Left, tSpiderValue *Right); +extern tSpiderValue *AST_ExecuteNode_UniOp(tSpiderScript *Script, tAST_Node *Node, int Operation, tSpiderValue *Value); +extern tSpiderValue *AST_ExecuteNode_Index(tSpiderScript *Script, tAST_Node *Node, tSpiderValue *Array, int Index, tSpiderValue *SaveValue); +extern tSpiderValue *AST_ExecuteNode_Element(tSpiderScript *Script, tAST_Node *Node, tSpiderValue *Object, const char *Element, tSpiderValue *SaveValue); #endif