X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibspiderscript.so_src%2Fparse.c;h=b25dd21246e85748ba4cf771ed971a6fb5018cf7;hb=ec6f426069129f0a3d207f743ecddceddb57db8e;hp=31dabadec76970f62cb93e2efdf64f3d100990a6;hpb=1529dadb6c2170bf9899fbde46d06a3d9a392b52;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libspiderscript.so_src/parse.c b/Usermode/Libraries/libspiderscript.so_src/parse.c index 31dabade..b25dd212 100644 --- a/Usermode/Libraries/libspiderscript.so_src/parse.c +++ b/Usermode/Libraries/libspiderscript.so_src/parse.c @@ -36,6 +36,11 @@ tAST_Node *Parse_GetIdent(tParser *Parser); void SyntaxAssert(tParser *Parser, int Have, int Want); +#define TODO(Parser, message...) do {\ + fprintf(stderr, "TODO: "message);\ + longjmp(Parser->JmpTarget, -1);\ +}while(0) + // === CODE === /** * \brief Parse a buffer into a syntax tree @@ -64,12 +69,14 @@ tAST_Script *Parse_Buffer(tSpiderVariant *Variant, char *Buffer) ret = AST_NewScript(); mainCode = AST_NewCodeBlock(); + // Give us an error fallback if( setjmp( parser.JmpTarget ) != 0 ) { AST_FreeNode( mainCode ); return NULL; } + // Parse the file! while(Parser->Token != TOK_EOF) { switch( GetToken(Parser) ) @@ -159,7 +166,12 @@ tAST_Script *Parse_Buffer(tSpiderVariant *Variant, char *Buffer) tAST_Node *Parse_DoCodeBlock(tParser *Parser) { tAST_Node *ret; - SyntaxAssert(Parser, GetToken(Parser), TOK_BRACE_OPEN ); + + // Check if we are being called for a one-liner + if( GetToken(Parser) != TOK_BRACE_OPEN ) { + PutBack(Parser); + return Parse_DoBlockLine(Parser); + } ret = AST_NewCodeBlock(); @@ -190,11 +202,30 @@ tAST_Node *Parse_DoBlockLine(tParser *Parser) ret = AST_NewUniOp(NODETYPE_RETURN, Parse_DoExpr0(Parser)); break; + // Control Statements + case TOK_RWD_IF: + { + tAST_Node *cond, *true, *false = NULL; + GetToken(Parser); // eat the if + SyntaxAssert(Parser, GetToken(Parser), TOK_PAREN_OPEN); + cond = Parse_DoExpr0(Parser); // Get condition + SyntaxAssert(Parser, GetToken(Parser), TOK_PAREN_CLOSE); + true = Parse_DoCodeBlock(Parser); + if( LookAhead(Parser) == TOK_RWD_ELSE ) { + GetToken(Parser); + false = Parse_DoCodeBlock(Parser); + } + ret = AST_NewIf(cond, true, false); + } + return ret; + case TOK_RWD_FOR: + case TOK_RWD_DO: + case TOK_RWD_WHILE: + TODO(Parser, "Implement if, for, do and while\n"); + break; + // Define Variables - case TOK_RWD_OBJECT: - case TOK_RWD_STRING: - case TOK_RWD_REAL: - case TOK_RWD_INTEGER: + case TOKEN_GROUP_TYPES: { int type;