Esempio n. 1
0
BaseExpression* Parser::handleKeyword(string keyword)
{
	int type = StringSwitch<int>(StringRef(keyword))
	.Case("printf", 0)
	.Case("scanf", 1)
	.Case("return", 10);
	BaseExpression *expr;
	LexerToken token;
	switch(type) {
		case 0:
			token = mLexer->getToken();
			if(token.value == "(") {
				expr = new PrintfInvocation(handleIdentifier(mLexer->getToken()));
			}
			token = mLexer->getToken();

			if(token.value != ";") {
				throw "Expected )";
			}
			break;
		default:
			break;
	}
	return expr;
}
void handleArray(string line){

	if(contains(line, "<callArray>")){
		if (contains(getNextLine(), "<identifier>")) {
			string id = getCurrLine();
			
			handleExpression(getNextLine());//looks inside [...]
			handleIdentifier(id);//pushes array name on stack
			writeArithmetic("+");//offset array
			//writePop("pointer", 1); //set point to correct place in memory
//			writePush("that", 0); //place array[offset] on stack
			while ( !contains(getCurrLine(), "</callArray>")) {
				incFilePtr();
			}
		}else{
			error("expected to get array name <identifier> at this point");
		}
	}else{
		error("expected callArray");
	}
}
Esempio n. 3
0
void Parser::parse()
{
	LexerToken currentToken;
	
	do {
		currentToken = mLexer->getToken();

		BaseExpression* expr = 0;
		switch (currentToken.type) {
			case TYPE:
				expr = handleType(currentToken.value);
				break;
			case IDENTIFIER:
				expr = handleIdentifier(currentToken);
				break;
			case EXPRESSION_END:
				
				break;
			case ASSIGNMENT_OP:
// 				handleAssignment();
				break;
			case CONST_NUMBER:

				break;
			case BRACE:
// 				handleBrace(currentToken.value.c_str()[0]);
				break;
			case KEYWORD:
				expr = handleKeyword(currentToken.value);
				break;
			default:
				break;
		}

		if(expr) {
			mExprList.push_back(expr);
		};
	} while (currentToken.type != TOKEN_EOF);
}