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