void CompilationEng::compileDo() { printNonterminal("doStatement"); numOfTab++; printCurrentToken(false); //<keyword> do </keyword> compileSubroutineCall(); printCurrentToken(); //<symbol> ; </symbol> numOfTab--; printNonterminal("doStatement",false); }
void CompilationEngine::compileDo() { /* 'do' subroutineCall ';' */ tagNonTerminal("doStatement"); readKeyword("do", Keyword::kDO); nextToken(); compileSubroutineCall(); readSymbol(';'); untagNonTerminal("doStatement"); nextToken(); }
void CompilationEngine::compileTerm() // 362 { // integerConst | stringConst | keywordConst | // varName | varName '[' expression ']' | subroutineCall | // '(' expression ')' | unaryOp term tagNonTerminal("term"); string id; string oldTok; switch(jt.tokenType()) { case TokenType::kINT_CONST: readIntConst(); break; case TokenType::kSTRING_CONST: readStringConst(); break; case TokenType::kKEYWORD: readKeywordConstant(); break; case TokenType::kIDENTIFIER: id = jt.getToken(); // save current token nextToken(); if (jt.tokenType() == TokenType::kSYMBOL && jt.symbol() == '[') { oldTok = jt.getToken(); jt.setToken(id); readIdentifier(); jt.setToken(oldTok); readSymbol('['); nextToken(); compileExpression(); readSymbol(']'); nextToken(); } else if (jt.tokenType() == TokenType::kSYMBOL && (jt.symbol() == '.' || jt.symbol() == '(')) { compileSubroutineCall(id); } else { oldTok = jt.getToken(); jt.setToken(id); readIdentifier(); jt.setToken(oldTok); } untagNonTerminal("term"); return; // has already advanced break; case TokenType::kSYMBOL: if (jt.symbol() == '(') { // '(' expression ')' readSymbol('('); nextToken(); compileExpression(); readSymbol(')'); } else { // unaryOp term readUnaryOp(); nextToken(); compileTerm(); untagNonTerminal("term"); return; // has already advanced } break; default: break; } nextToken(); untagNonTerminal("term"); }