/*** Parse a statement ***/ Node* Parser::parseStatement() { if(hasTokens(2) && peekToken().getType() == T_IDENTIFIER && peekToken(2).getType() == T_ASSIGN) return parseAssign(); if(hasTokens(2) && peekToken().getType() == T_IDENTIFIER && peekToken(2).getType() == T_LPAREN) return parseCall(); if(hasTokens() && peekToken().getType() == T_CALL) return parseCall(); if(hasTokens() && peekToken().getType() == T_CASE) return parseCase(); if(hasTokens() && peekToken().getType() == T_DO) return parseDo(); if(hasTokens() && peekToken().getType() == T_END) return parseEnd(); if(hasTokens() && peekToken().getType() == T_EXIT) return parseExit(); if(hasTokens() && peekToken().getType() == T_FOR) return parseFor(); if(hasTokens() && peekToken().getType() == T_IF) return parseIf(); if(hasTokens() && peekToken().getType() == T_INPUT) return parseInput(); if(hasTokens() && peekToken().getType() == T_OUTPUT) return parseOutput(); if(hasTokens() && peekToken().getType() == T_REPEAT) return parseRepeat(); if(hasTokens() && peekToken().getType() == T_RETURN) return parseReturn(); if(hasTokens(2) && peekToken(1).getType() == T_IDENTIFIER && peekToken(2).getType() == T_LBRACKET) return parseSliceSelectAssign(); if(hasTokens() && peekToken().getType() == T_WHILE) return parseWhile(); throw ParserSyntaxException(getToken(), "Invalid statement!"); return 0; }
void MaiaXmlRpcServerConnection::readFromSocket() { QString lastLine; while(clientConnection->canReadLine() && !header) { lastLine = clientConnection->readLine(); headerString += lastLine; if(lastLine == "\r\n") { /* http header end */ header = new QHttpRequestHeader(headerString); if(!header->isValid()) { /* return http error */ qDebug() << "Invalid Header"; return; } else if(header->method() != "POST") { /* return http error */ qDebug() << "No Post!"; return; } else if(!header->contentLength()) { /* return fault */ qDebug() << "No Content Length"; return; } } } if(header) { if(header->contentLength() <= clientConnection->bytesAvailable()) { /* all data complete */ parseCall(clientConnection->readAll()); } } }
ExpPtr parseTermPostfix (Lexer& lex, ExpPtr in) { for (;;) switch (lex.current().tok) { case tLParen: in = parseCall(lex, in); break; case tDot: in = parseMem(lex, in); break; default: return in; } }
Object * parseValue(Collector * c, Tokenizer * tt) { TokenType t = tokenizerNext(tt); switch (t) { case TOK_CELLID: return parseReferenceOrRange(c, tt); case TOK_NUMBER: return parseNumber(c, tt); case TOK_STRING: return parseString(c, tt); case TOK_ID: return parseCall(c, tt); case TOK_LBRACKET: return parsePattern(c, tt); default: return NULL; } }
AstNode* Parser::parseUnary() { if (isUnaryOp(currentToken())) { TokenKind op = currentToken(); consumeToken(); return new UnaryOpNode(_currentTokenIndex, op, parseUnary()); } else if (currentToken() == tIDENT && lookaheadToken(1) == tLPAREN) { AstNode* expr = parseCall(); return expr; } else if (currentToken() == tIDENT) { AstVar* var = _currentScope->lookupVariable(currentTokenValue()); if (var == 0) { error("undeclared variable: %s", currentTokenValue().c_str()); } LoadNode* result = new LoadNode(_currentTokenIndex, var); consumeToken(); return result; } else if (currentToken() == tDOUBLE) { DoubleLiteralNode* result = new DoubleLiteralNode(_currentTokenIndex, parseDouble(currentTokenValue())); consumeToken(); return result; } else if (currentToken() == tINT) { IntLiteralNode* result = new IntLiteralNode(_currentTokenIndex, parseInt(currentTokenValue())); consumeToken(); return result; } else if (currentToken() == tSTRING) { StringLiteralNode* result = new StringLiteralNode(_currentTokenIndex, currentTokenValue()); consumeToken(); return result; } else if (currentToken() == tLPAREN) { consumeToken(); AstNode* expr = parseExpression(); ensureToken(tRPAREN); return expr; } else { error("Unexpected token: %s", tokenStr(currentToken())); return 0; } }
ParseStatus Parser::parseCallOrDecl() { Token name = lex[0]; Token op = lex[1]; assert(name.isIdentifier()); assert(op.isOperator() || op.isDelimiter()); if (op.isDelimiter()) { assert(op.isDelimiter(DL_LPAREN)); // Function call. return parseCall(); } if (op.isOperator(OP_DECLARE) | op.isOperator(OP_COLON)) { return parseDecl(); } return PARSE_OK; }