NODETYPE_CAST, //!< Cast a value to another (Uniop)
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
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
- 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;
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
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
// === 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);
-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 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);
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);
#endif