コード例 #1
0
ファイル: parser.cpp プロジェクト: denrusio/vak-opensource
/*** 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;
}
コード例 #2
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());
		}
    }
}
コード例 #3
0
ファイル: Parser.cpp プロジェクト: iitalics/Jupiter
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;
		}
}
コード例 #4
0
ファイル: Formula.c プロジェクト: xaberus/spreadsheet
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;
	}
}
コード例 #5
0
ファイル: parser.cpp プロジェクト: nvmd/spbau-mathvm
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;
    }
}
コード例 #6
0
ファイル: Parser.cpp プロジェクト: aappleby/Tuplit
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;
}