SpiderScript - A day of debugging and improvements
[tpg/acess2.git] / Usermode / Libraries / libspiderscript.so_src / parse.c
index 3e01bb1..6e1696e 100644 (file)
@@ -48,7 +48,7 @@ void  SyntaxAssert(tParser *Parser, int Have, int Want);
 tAST_Script    *Parse_Buffer(tSpiderVariant *Variant, char *Buffer)
 {
        tParser parser = {0};
-       tParser *Parser = &parser;      //< Keeps code consitent
+       tParser *Parser = &parser;      //< Keeps code consistent
        tAST_Script     *ret;
        tAST_Node       *mainCode;
        char    *name;
@@ -110,7 +110,7 @@ tAST_Script *Parse_Buffer(tSpiderVariant *Variant, char *Buffer)
                // Define a function
                case TOK_RWD_FUNCTION:
                        if( !Variant->bDyamicTyped ) {
-                               fprintf(stderr, "ERROR: Attempt to create a dynamic function\n");
+                               fprintf(stderr, "ERROR: Dynamic functions are invalid in static mode\n");
                                longjmp(Parser->JmpTarget, -1);
                        }
                        type = SS_DATATYPE_DYNAMIC;
@@ -194,10 +194,13 @@ tAST_Node *Parse_DoBlockLine(tParser *Parser)
        
        switch(LookAhead(Parser))
        {
+       // Empty statement
+       case TOK_SEMICOLON:
+               GetToken(Parser);
+               return NULL;
        
        // Return from a method
        case TOK_RWD_RETURN:
-               //printf("return\n");
                GetToken(Parser);
                ret = AST_NewUniOp(Parser, NODETYPE_RETURN, Parse_DoExpr0(Parser));
                break;
@@ -218,10 +221,36 @@ tAST_Node *Parse_DoBlockLine(tParser *Parser)
                ret = AST_NewIf(Parser, cond, true, false);
                }
                return ret;
+       
        case TOK_RWD_FOR:
+               {
+               tAST_Node       *init=NULL, *cond=NULL, *inc=NULL, *code;
+               GetToken(Parser);       // Eat 'for'
+               SyntaxAssert(Parser, GetToken(Parser), TOK_PAREN_OPEN);
+               
+               if(LookAhead(Parser) != TOK_SEMICOLON)
+                       init = Parse_DoExpr0(Parser);
+               
+               SyntaxAssert(Parser, GetToken(Parser), TOK_SEMICOLON);
+               
+               if(LookAhead(Parser) != TOK_SEMICOLON)
+                       cond = Parse_DoExpr0(Parser);
+               
+               SyntaxAssert(Parser, GetToken(Parser), TOK_SEMICOLON);
+               
+               if(LookAhead(Parser) != TOK_PAREN_CLOSE)
+                       inc = Parse_DoExpr0(Parser);
+               
+               SyntaxAssert(Parser, GetToken(Parser), TOK_PAREN_CLOSE);
+               
+               code = Parse_DoCodeBlock(Parser);
+               ret = AST_NewLoop(Parser, init, 0, cond, inc, code);
+               }
+               return ret;
+       
        case TOK_RWD_DO:
        case TOK_RWD_WHILE:
-               TODO(Parser, "Implement if, for, do and while\n");
+               TODO(Parser, "Implement do and while\n");
                break;
        
        // Define Variables
@@ -293,16 +322,22 @@ tAST_Node *Parse_DoExpr0(tParser *Parser)
                GetToken(Parser);               // Eat Token
                ret = AST_NewAssign(Parser, NODETYPE_NOP, ret, Parse_DoExpr0(Parser));
                break;
-       #if 0
-       case TOK_DIV_EQU:
+       case TOK_ASSIGN_DIV:
                GetToken(Parser);               // Eat Token
                ret = AST_NewAssign(Parser, NODETYPE_DIVIDE, ret, Parse_DoExpr0(Parser));
                break;
-       case TOK_MULT_EQU:
+       case TOK_ASSIGN_MUL:
                GetToken(Parser);               // Eat Token
                ret = AST_NewAssign(Parser, NODETYPE_MULTIPLY, ret, Parse_DoExpr0(Parser));
                break;
-       #endif
+       case TOK_ASSIGN_PLUS:
+               GetToken(Parser);               // Eat Token
+               ret = AST_NewAssign(Parser, NODETYPE_ADD, ret, Parse_DoExpr0(Parser));
+               break;
+       case TOK_ASSIGN_MINUS:
+               GetToken(Parser);               // Eat Token
+               ret = AST_NewAssign(Parser, NODETYPE_SUBTRACT, ret, Parse_DoExpr0(Parser));
+               break;
        default:
                #if DEBUG >= 2
                printf("Parse_DoExpr0: Parser->Token = %i\n", Parser->Token);
@@ -634,11 +669,11 @@ tAST_Node *Parse_GetVariable(tParser *Parser)
 }
 
 /**
- * \brief Get an identifier (constand or function call)
+ * \brief Get an identifier (constant or function call)
  */
 tAST_Node *Parse_GetIdent(tParser *Parser)
 {
-       tAST_Node       *ret;
+       tAST_Node       *ret = NULL;
        char    *name;
        SyntaxAssert(Parser, GetToken(Parser), TOK_IDENT );
        name = strndup( Parser->TokenStr, Parser->TokenLen );
@@ -646,7 +681,9 @@ tAST_Node *Parse_GetIdent(tParser *Parser)
        #if 0
        while( GetToken(Parser) == TOK_SCOPE )
        {
-               ret = AST_New
+               ret = AST_NewScopeDereference( Parser, ret, name );
+               SyntaxAssert(Parser, GetToken(Parser), TOK_IDENT );
+               name = strndup( Parser->TokenStr, Parser->TokenLen );
        }
        PutBack(Parser);
        #endif
@@ -675,7 +712,7 @@ tAST_Node *Parse_GetIdent(tParser *Parser)
                }
        }
        else {
-               // Runtime Constant
+               // Runtime Constant / Variable (When implemented)
                #if DEBUG >= 2
                printf("Parse_GetIdent: Referencing '%s'\n", name);
                #endif

UCC git Repository :: git.ucc.asn.au