NodePointer Parser::returnStatement() { getNextSymbol(); NodePointer expressionTree; if (currentSymbol_.symbolType_ != SEMICOLON) { expressionTree = expression(); } accept(SEMICOLON); NodePointer returnStatement(new ReturnStatement(tables_.subroutineStack_, expressionTree, getLineNumber())); return returnStatement; }
NodePointer Parser::statement() { NodePointer result; switch (currentSymbol_.symbolType_) { case IF: return ifStatement(); case WHILE: return whileStatement(); case IDENTIFIER: case GLOBAL: case ARGUMENT: case CALL: case CONSTANT: result = expression(); accept(SEMICOLON); return result; case MY: return localVariable(); case PRINT: return printStatement(); case SUBROUTINE: return procedureDefinition(); case RETURN: return returnStatement(); case LEFT_BRACE: return blockStatement(); default: throw ErrorMessage("Unexpected symbol " + symbolToString(currentSymbol_), getLineNumber()); } }
AST* Parser::statement(Scope* ps) { AST* ret = NULL; if (expect(";")) { ret = emptyStatement(); } else if (expect("var")) { ret = varStatement(ps); opteol(); } else if (expect("{")) { ret = block(ps); opteol(); } else if (expect("if")) { ret = ifStatement(ps); } else if (expect("switch")) { ret = switchStatement(ps); } else if (expect("do")) { ret = doStatement(ps); opteol(); } else if (expect("while")) { ret = whileStatement(ps); } else if (expect("for")) { ret = forStatement(ps); } else if (expect("with")) { ret = withStatement(ps); } else if (expect("continue")) { ret = continueStatement(); opteol(); } else if (expect("break")) { ret = breakStatement(); opteol(); } else if (expect("return")) { ret = returnStatement(ps); opteol(); } else if (expect("try")) { ret = tryStatement(ps); } else if (expect("throw")) { ret = throwStatement(ps); opteol(); } else { ret = expression(0, ps); opteol(); } return ret; }