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"); } }
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); }