NODETYPE_REAL, //!< Real Constant
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)
NODETYPE_RETURN, //!< Return from a function (reserved word)
NODETYPE_ASSIGN, //!< Variable assignment operator
NODETYPE_FUNCTIONCALL, //!< Call a function
+ NODETYPE_METHODCALL, //!< Call a class method
+ NODETYPE_CREATEOBJECT, //!< Create an object
NODETYPE_IF, //!< Conditional
NODETYPE_LOOP, //!< Looping Construct
struct sAST_Script
{
+ // TODO: Namespaces and Classes
tAST_Function *Functions;
tAST_Function *LastFunction;
};
} BinOp;
struct {
+ tAST_Node *Object;
tAST_Node *FirstArg;
tAST_Node *LastArg;
char Name[];
} For;
/**
- * \note Used for \a NODETYPE_VARIABLE and \a NODETYPE_CONSTANT
+ * \note Used for \a NODETYPE_VARIABLE, \a NODETYPE_CONSTANT and
+ * \a NODETYPE_SCOPE
*/
struct {
char _unused; // Shut GCC up
char Name[];
} Variable;
+ struct {
+ tAST_Node *Element;
+ char Name[];
+ } Scope; // Used by NODETYPE_SCOPE and NODETYPE_ELEMENT
+
struct {
int DataType;
- int Depth;
tAST_Node *LevelSizes;
tAST_Node *LevelSizes_Last;
char Name[];
tSpiderScript *Script; //!< Script
tAST_Variable *FirstVar; //!< First variable in the list
tSpiderValue *RetVal;
+ tSpiderNamespace *BaseNamespace; //!< Base namespace (for entire block)
+ tSpiderNamespace *CurNamespace; //!< Currently selected namespace
};
struct sAST_Variable
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 tAST_Node *AST_NewString(tParser *Parser, const char *String, int Length);
extern tAST_Node *AST_NewInteger(tParser *Parser, uint64_t Value);
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);
+extern tAST_Node *AST_NewClassElement(tParser *Parser, tAST_Node *Object, const char *Name);
+
extern tAST_Node *AST_NewFunctionCall(tParser *Parser, const char *Name);
+extern tAST_Node *AST_NewCreateObject(tParser *Parser, const char *Name);
+extern tAST_Node *AST_NewMethodCall(tParser *Parser, tAST_Node *Object, const char *Name);
extern void AST_AppendFunctionCallArg(tAST_Node *Node, tAST_Node *Arg);
-extern tAST_Node *AST_NewCodeBlock(void);
+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_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_NewScopeDereference(tParser *Parser, const char *Name, tAST_Node *Child);
extern void AST_FreeNode(tAST_Node *Node);